-1

OpenGL 3.2で単純な長方形を作成し終えたところですが、照明のサポートを追加したいと思います。ただし、法線をフラグメントシェーダーに移動しようとすると、何も表示されません。その行をコメントアウトすると、再び完全に機能します。これを引き起こす理由は何でしょうか?エラーログには何も表示されません。

頂点シェーダー:

#version 150

in vec4 position;
in vec3 inNormal;

out vec3 varNormal;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    //varNormal = inNormal; //If I uncomment this line, nothing shows up    
gl_Position = modelViewProjectionMatrix * position;
}

フラグメントシェーダー:

#version 150

in vec3 varNormal;

out vec4 fragColor;

void main()
{
fragColor = vec4(1, 1, 1, 1);   
}

そして法線を渡す:



GLuint posAttrib = 0;
GLuint normalAttrib = 1;

glBindAttribLocation(program, posAttrib, "position");
glBindAttribLocation(program, normalAttrib, "normalAttrib");

//Building the VAO's/VBO's
GLfloat posCoords[] = 
{
    -10, 0.0, -10,
    -10, 0.0, 10,
    10, 0.0, 10,
    10, 0.0, -10,   
};

GLfloat normalCoords[] = 
{
    0, 0, 1,
    0, 0, 1,
    0, 0, 1,
    0, 0, 1
};

glGenVertexArrays(1, &vaoName);
glBindVertexArray(vaoName);

GLuint posBuffer;
glGenBuffers(1, &posBuffer);
glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(posCoords), posCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(posAttrib);   
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

GLuint normalBuffer;        
glGenBuffers(1, &normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(normalCoords), normalCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(normalAttrib);
glVertexAttribPointer(normalAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

私は自分の位置と通常の座標のすべてを単一のVBOに入れようとはしていませんが、その方法に頼りたくありません。

4

2 に答える 2

1

それが実際のコードなのかカット アンド ペーストなのかはわかりませんが、glBindAttribLocation の呼び出しは、glLinkProgram の次の呼び出し後にのみ有効になります。

glBindAttrib を呼び出した後にプログラムをリンクしていない場合、それらは有効にならず、属性に間違ったインデックスが与えられる可能性があります。これは、通常の行のコメントを外した後に異なる動作が発生する理由を説明できます。

于 2012-07-16T04:39:33.283 に答える
0

おそらくこれを修正する最も奇妙な理由ですが、うまくいきます。

まず、OpenGL プロファイラーがどのように機能するかを確認してください。Apple Docsが提供するチュートリアルがあります

glDrawElements (または使用しているものに応じて glDrawArray) の前後にブレークポイントを設定します。

次に、プログラムの頂点属性を見て、位置が正しいことを確認してください。

そうでない場合は、並べ替えます。

から(または他のもの):

enum
{
POSITION_ATTR = 0,
TEXTURE_ATTR=1,
NORMAL_ATTR=2,
};

に:

enum
{
NORMAL_ATTR = 0,
TEXTURE_ATTR=2,
POSITION_ATTR=1,
};

これがどのように、なぜ起こっているのかわかりませんが、これが問題の解決策です。

于 2012-10-14T06:56:26.003 に答える