2

OpenGL SuperBible 5th edition を参照して、3D シーンに半透明の 2D オーバーレイを作成する方法を見つけようとしています。

これには、テクスチャ ターゲット GL_TEXTURE_RECTANGLE と sampler2DRect と呼ばれる GLSL ユニフォーム タイプを使用して、OpenGL ロゴをシーン (第 7 章) にオーバーレイする例があります。テクスチャは、texture() コマンドを使用してフラグメント シェーダに表示されることになっています。

この本の例では多くのソース ファイルが使用されており、簡単なプログラムでそれを実装するのに非常に苦労しています。

正射投影に切り替える部分には問題はなく、テクスチャを読み込もうとすると、表面が白く表示されるだけです。私のコードはこの時点で非常に乱雑になり、問題を特定できないようです。そのため、より簡単な例がどこかにある場合は、次のように最初からやり直したいと思います。

PS 重要な場合に備えて、画像ファイルの読み込みに SFML 2.0rc を使用しています。

4

2 に答える 2

3
error C1101: ambiguous overloaded function reference "mul(mat4, vec3)" 
     (0) : mat3x4 mul(mat3x1, mat1x4)
     (0) : mat3 mul(mat3x1, mat1x3) 
     (0) : mat3x2 mul(mat3x1, mat1x2) 
     (0) : mat3x1 mul(mat3x1, mat1) 
     (0) : mat2x4 mul(mat2x1, mat1x4) 
     .....

mat4これは、 aと aを乗算するような関数は存在しないことを伝える非常に冗長な方法ですvec3。次に、 の正当なバリアントをすべてリストしますmul

行列を乗算するときは次元が一致する必要があります。おそらく必要なのは、 amat4と aを乗算することvec4です。これが位置座標の1.0場合は、ベクトルの最終値としてa を追加します。

uniform mat4 mvpMatrix;
in vec3 position;

main()
   gl_Position = mvpMatrix * vec4(position, 1.0);
于 2012-08-21T03:07:37.477 に答える
2

ティムの答えに加えて、次のことを確認してください。

  • あなたのテクスチャはバインドされています: glBindTexture(GL_TEXTURE_2D, textureID);
  • 頂点シェーダーは UV 座標を出力します。
  • 頂点シェーダーは UV 座標を取得します。vec2 UV では。
  • UV を持つ VBO が存在し、有効化され、バインドされ、設定されています ( glEnableVertexAttribArray、glBindBuffer、glVertexAttribPointer )
  • glEnable(GL_TEXTURE_2D)

長方形テクスチャの特別なアイテム:

  • UV 座標は [0,width]x[0,height] です (長方形テクスチャの特殊なケース)。
  • クワッドに約があることを確認してください。テクスチャと同じサイズ ( rect.tex にはミップマップがありません)
  • 代わりに標準のテクスチャを使用してください。それらは NPOT である可能性があります。

また:gDebuggerを使用してください。

于 2012-08-23T16:35:17.827 に答える