タグ付けされた質問 「hlsl」

Microsoft Direct3D APIで使用するためにMicrosoftが開発した独自のシェーディング言語。

1
平面反射を行う際の波の説明
私はSDKからNvidiaの例、特にIsland11プロジェクトを研究してきましたが、波の高さの状態に応じて反射を上下に補正するHLSLコードの一部に興味を持ちました。 当然、コードの短い段落を調べた後: // calculating correction that shifts reflection up/down according to water wave Y position float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix); float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix); waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y); 私の最初の推測は、垂直の摂動(波)を受けたときに平面反射を補正し、反射ジオメトリを何もない場所にシフトし、水が空または空だけのようにレンダリングされることでした: さて、それは私たちが地形の緑/灰色/黄色がかった反射が水の基線で折り返されるのを見るべき場所を反映している空です。問題は、その背後にあるロジックを正確に特定できないことです。波/水ジオメトリのポイントの実際のワールド空間位置を投影してから-.5fを掛けて、同じポイントの別の投影を取得します。今回はy座標を-0.8に変更します(なぜ-0.8?)。 コード内の手がかりは、冗長性があるため試行錯誤で派生したことを示しているようです。たとえば、著者は投影されたy座標の負の半分(w除算後)を取得します。 float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; そして、2番目のポイントについても同じことを行い(肯定的なだけで、何らかの違いを得るために、私は推測します)、それらを組み合わせます: waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; 2による除算を削除しても、品質の改善に違いは見られません(誰かが私を修正したい場合は行ってください)。それの核心は、投影されたyの違いのようです。なぜですか?この冗長性と-.8fと-0.15fの一見arbitrary意的な選択により、これはヒューリスティック/推測の組み合わせであると結論付けられます。これには論理的な根拠がありますか、それとも単なる必死のハックですか? これは、コードフラグメントが修正する初期問題の誇張です。最低のテッセレーションレベルで観察します。うまくいけば、それは私が見逃しているアイデアを引き起こすかもしれません。-.8fは、平面反射されたジオメトリレンダリングをサンプリングするテクスチャ座標を乱す量を推定する基準高さであり、-。15fはセキュリティ対策である下限です。

2
乱数hlsl
HLSLで乱数を生成するにはどうすればよいですか? gpuレイトレーシングを試したいので、私は尋ねています。ピクセルシェーダーでランダムな方向を生成する必要があります。したがってrandFloat()、結果は-1〜+1の乱数になります。 また、hlsl ノイズ命令との取引は何ですか?ドキュメントには、HLSL 2.0以降から削除されたと書かれています。なんで? テクスチャをランダムな値で満たし、そのテクスチャへのインデックスを持つ各頂点にテクスチャ座標を設定するアプローチについて読みました。しかし、それは頂点ごとです。ピクセルシェーダーで呼び出すことができる命令が必要です。さらに、このアプローチでは、フレームごとに異なる値が必要な場合は、頂点ごとのtexcoordsを「再シード」する必要があり、各フレームで頂点バッファーを更新する必要があります(高価になる可能性があります!) 詳細を説明すると、GPUで乱数を安価に生成する方法を教えてください。
13 hlsl  random  gpu 

2
DirectX11、複数のシェーダー定数バッファーを管理および更新するにはどうすればよいですか?
さて、定数バッファがパイプラインステージにバインドされて更新される方法を把握するのは大変です。DirectX11では、ステージごとに最大15個のシェーダー定数バッファーを使用でき、各バッファーには最大4096個の定数を保持できることを理解しています。ただし、定数バッファーと対話するために使用されるID3D11Buffer COMが、これらのバッファースロットを埋めるために使用されるメカニズム(またはハンドル)だけであるか、またはオブジェクトが実際に前後にプッシュされるバッファーデータの特定のインスタンスを参照するかどうかがわかりませんGPUとCPUの間。 このトピックに関する混乱は、2つの異なる定数バッファーを使用している問題の原因だと思います。 シェーダーコードの例を次に示します。 cbuffer PerFrame : register(b0) { float4x4 view; }; cbuffer PerObject : register(b1) { float4x4 scale; float4x4 rotation; float4x4 translation; }; コードの編成方法では、カメラはフレームごとの関連データの更新を処理し、GameObjectsはオブジェクトごとの独自のデータを更新します。両方のクラスには、これを行うために使用される独自のID3D11Bufferがあります(ハブアーキテクチャを使用しているため、1つのGameObjectクラスが、世界中のインスタンス化されたGameObjectsのレンダリングを処理します)。 問題は、スロットに応じて一度に1つしか更新できないことです。更新順序は、1つのバッファーが満たされ、もう1つのバッファーがゼロになると仮定しています。 これは基本的に私のコードです。両方のクラスは同一の更新ロジックを使用します。 static PerObjectShaderBuffer _updatedBuffer; // PerFrameShaderBuffer if Camera class _updatedBuffer.scale = _rScale; _updatedBuffer.rotation = _rRotation; _updatedBuffer.translation = _rTranslation; pDeviceContext->UpdateSubresource(pShaderBuffer, 0 , 0, &_updatedBuffer, 0, …

3
HLSL半透明プラスチックシェーダー
私はシェーダーを作成して、内部に色のついた光を持つ白いプラスチックのオブジェクトを複製しようとしています。半透明のシェーダーを使用してオブジェクト内にライトを配置すると、ライトが透けて見えるようになるか、ライトの効果を偽装するシェーダーを使用します。 効果は、これらの写真のようなランプシェードを通過する光のようなものです。 理想的には、光の強度と色を制御して、いくつかの素敵な明るい蛍光色を脈動させて回転させることができます どこから始めればいいのかわかりませんが! 私の質問は、そのようなシェーダーを作成できるように研究すべきテクニックを知っている人や、出発点として使用できる同じ/類似のシェーダーの例を持っている人はいますか?または、仕事をするかもしれないシェーダーを提供したい場合でも
12 graphics  shaders  hlsl 

1
画面スペースの派生物とは何ですか、いつ使用しますか?
私が見るddxとddyGLSLの機能をし、HLSL同等物は、すべての今してシェーダコードに出てきます。私は現在それらを使用して、接線または接線なしでバンプマッピングを行っていますが、基本的にコードをコピーして貼り付けました。これらの関数が実際に何であるか、それらが何をするのか、いつ使用するのかを理解できません。 だから質問: スクリーンスペース微分関数とは何ですか? これらの関数は何をしますか?入力値と出力値 最も一般的に使用される効果は何ですか? これらの機能に目を向けるには、どのような効果が必要ですか?

1
テッセレーションとジオメトリシェーダー
私が間違っている場合は修正してください。ただし、ジオメトリシェーダージョブとテッセレーションシェーダージョブはどちらも、グラフィックパイプラインで頂点を生成するためのものです。私が知りたいのは、それらがどのように違うのか、そしてどちらをいつ使うべきかということです。

4
HLSLシェーダーは実際にレンダー出力にどのように影響するのですか?
私はHLSLの構文を理解しています。たとえば、これを自分のHLSLであるとしましょう。 struct VOut { float4 position : SV_POSITION; float4 color : COLOR; }; VOut VShader(float4 position : POSITION, float4 color : COLOR) { VOut output; output.position = position; output.position.xy *= 0.7f; // "shrink" the vertex on the x and y axes output.color = color; return output; } float4 PShader(float4 position …
11 directx  hlsl 

1
複数のライトによる高速照明
複数のライトで高速ライティングを実装するにはどうすればよいですか? プレイヤーを拘束したくありません。彼は無制限の数を配置でき、場合によっては重なっている(ポイント)ライトをレベルに配置できます。 問題は、ライティングの計算に必要な動的ループを含むシェーダーが非常に遅くなる傾向があることです。 コンパイル時にシェーダーをn回コンパイルすることが可能である場合、nはライトの数であるという考えがありました。コンパイル時に数値nがわかっている場合は、ループを自動的に展開できます。これは、異なる数のライトで同じシェーダーのnバージョンを生成することは可能ですか? 実行時に、レベルのどの部分にどのシェーダーを使用するかを決定できます。


1
2D水上面プロファイル
頂点フラグメントシェーダーを使用して、水面の厚さの効果を作成しようとしています。 私は3Dゲーム環境にいますが、それはスクロールビューなので、「2D」ビューです。 以下は、フラグメントシェーダーを使用して実際の2Dでこのような効果を作成するための優れたチュートリアルです。 しかし、これは私の場合には使用できないと思います。今のところ、屈折を適用するのは平面だけです。 そして、水厚効果を適用したいです。しかし、私はそれを行う方法がわかりません。 現時点では、頂点を使用して水の変形/変位を作成しようとはしていません。これはポイントではありません。 シンプルなクワッドで可能かどうかはわかりませんが、このようなオブジェクトを使用する必要があるかもしれません。 下記は用例です。 この効果をどのように作成するかについては、私にはまったくわかりません。 どうもありがとう ! [ 編集 ]レイマンウォーターエフェクトが追加され、エフェクトの参照が改善されました。

3
ブール値をパックしてD3D定数バッファーに配置できないのはなぜですか?
了解しました。ブール値をパックしてhlsl定数バッファーに配置するのに苦労しています。その理由はわかりません。 これはhlslのバッファです cbuffer MaterialBuffer : register(b1) { float3 materialDiffuseAlbedo; float materialSpecularExponent; float3 materialSpecularAlbedo; bool isTextured; }; そして、ここはC ++です struct GeometryBufferPass_MaterialBuffer { XMFLOAT3 diffuse; float specularExponent; XMFLOAT3 specular; bool isTextured; }; 私は運が悪いので、ブールを移動し、構造体にさまざまな方法でパディングしました。これを行う正しい方法は何ですか?

1
波紋効果?
タワーディフェンスゲームに取り組んでいますが、これまでのところ、結果に本当に満足しています。ただし、追加したいことが1つあります。 Windows Phone 7のGeoDefenseのビデオをここで見ました:http : //www.youtube.com/watch? v=YhPr4A4LRPQ (ユニットが殺されるか、発射体がユニットに当たったとき)背景がなんらかの波効果で波打つ様子に注目してください。 どうすれば同等のものを作ることができますか?多くの頂点で構成されるクワッドを使用して、頂点シェーダーで何とかする必要があると思います。 あなたの電話は何ですか? 編集 XNAゲームはWindows Phone用ではなく、Windows PC用に作成されていることに注意してください。
9 xna  c#  hlsl 

3
非常に遅いdirect3Dテクスチャサンプリング
そのため、Direct3D 9を使用して小さなゲームを作成し、地形にマルチテクスチャリングを使用しています。私がしているのは、3つのテクスチャとブレンドマップをサンプリングし、ブレンドマップのカラーチャネルに基づいて、3つのテクスチャから全体の色を取得することだけです。とにかく、2つ以上のテクスチャをサンプリングすると、フレームレートが大幅に低下します。120+fpsから50弱までです。 これは、スローダウンの原因となっているHLSLコードです。 float3 ground = tex2D(GroundTex, multiTex).rgb; float3 stone = tex2D(StoneTex, multiTex).rgb; float3 grass = tex2D(GrassTex, multiTex).rgb; float3 blend = tex2D(BlendMapTex, blendMap).rgb; 私はそれを間違っていますか?テクスチャサンプリングなどに関する情報やヒントを誰かが持っているとしたら、それは素晴らしいことです。 ありがとう。

1
奇妙なSSAO効果(ビュースペース内の位置/通常のテクスチャが間違っていますか?)
主にホセマリアメンデスのgamedev.netチュートリアルに基づいて、ゲームエンジン(DirectX 11、C ++)でSSAO効果を作成しようとしています。残念ながら、テクスチャ作成の問題(法線、位置)はカバーしていません。 最初のパスでは通常のテクスチャを作成し、次に深度バッファもテクスチャとして読み取ります(2番目のパスでシェーダーリソースビューを作成し、深度バッファのバインドを解除するため可能です)。どちらもビュースペースにある必要があります。 ぼかしはまだ実装していません(後で実行します)が、現在いくつかの問題があります。テクスチャの計算が間違っているか、テクスチャからデータを変換する方法が間違っているためではなく、数式やパラメータの値が間違っているためと考えられます。 何がうまくいかなかったかについての私の推測: (ビュー空間での)通常のテクスチャ計算-しかし、それは見えます[OK]を、 位置テクスチャの計算(ビュー空間で)と位置から深度への変換 逆投影行列計算、 何かが正規化も飽和もされていないはずですが、 パラメータ(ただし、出力にそのような影響を与えるべきではありません)? 私のテクスチャ 拡散(textures[0]、ここでは実際には使用されません、比較のためにのみ): 通常(textures[1]、ビュー空間にある必要があります): 私はそれらを最初のパスの頂点シェーダーで取得します(ピクセルシェーダーはちょうどですoutput.normal = input.normal): output.normal = float4(mul(input.normal, (float3x3)world), 1); output.normal = float4(mul(output.normal, (float3x3)view), 1); 深度バッファテクスチャ(textures[2]、値の差が小さいため何も見にくいですが、問題ないと思います): それを表示するために私は使用します: float depth = textures[2].Sample(ObjSamplerState, textureCoordinates).r; depth = (depth + 1.0f) / 2.0f; color.rgb = float3(depth, depth, depth); 外部プログラムでのコントラスト補正後(私はシェーダーを使用しませんが、目には良いです): 深度バッファーの説明: //create depth …
8 c++  directx  directx11  hlsl  ssao 

1
OpenGLで頂点を描画する最も効率的な方法
私はOpenGL 3Dゲームを書いています。地形や使用中のオブジェクト用の多数の三角形があります。 私はOpenGL公式ガイドから勉強していて、最初に提示された方法は、描画したい各頂点のglVertex後に関数を呼び出すglBeginことです。 ただし、何千もの三角形を描く必要がある場合、この方法はかなり古くて非効率的です。各フレームで変化しない情報をグラフィックカードのメモリに保存する方法があるので、各フレームをレンダリングすると、その情報はすでにそこにあります。より「不安定な」情報については、おそらくフレームごとに新しい頂点データを送信する必要があるため、別の手法の方が効率的かもしれません。 私の質問に来ます:頂点情報をハードウェアに送信し、レンダリングするための指示を与えるために使用される最も近代的で効率的なOpenGL関数と技術の明確な説明をお願いします。 フレーム中にめったに変化しない頂点データをレンダリングするための順序を送信するための最良の方法とOpenGLツールは何ですか(私は地形とオブジェクトについて考えます)、フレーム中に大きく変化する頂点データを送信するための最良の方法は何ですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.