2

次の非常に単純な頂点シェーダーがあります。レンダリングすると、空白の画面が表示されます。

#version 110

layout(location = 1) attribute vec3 position;

uniform mat4 modelview_matrix;
uniform mat4 projection_matrix;

void main() {
    vec4 eye = modelview_matrix * vec4(position, 1.0);

    gl_Position = projection_matrix * eye;
}

ただし、変更

layout(location = 1) attribute vec3 position;

layout(location = 0) attribute vec3 position;

正しくレンダリングできます。これが私のレンダリング関数です:

glUseProgram(program);

GLenum error;

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glUniformMatrix4fv(
    modelview_uniform, 1, GL_FALSE, glm::value_ptr(modelview));
glUniformMatrix4fv(
    projection_uniform, 1, GL_FALSE, glm::value_ptr(projection));

glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glVertexAttribPointer(
    position_attribute,
    3,
    GL_FLOAT,
    GL_FALSE,
    0,
    (void*)0);
glEnableVertexAttribArray(position_attribute);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buffer);
glDrawElements(
    GL_TRIANGLES,
    monkey_mesh.indices.size(),
    GL_UNSIGNED_INT,
    (void*)0);

glDisableVertexAttribArray(position_attribute);

glutSwapBuffers();

position_attributeを呼び出して取得しglGetAttribLocation(program, "position");ます。どちらの場合も正しい値が含まれています (最初のケースでは 1、2 番目のケースでは 0)。

私が間違っていることはありますか?運が良かったという理由だけでいつレンダリングできると確信してlocation == 0おり、データはまったくの運によってそこに書き込まれますが、どのステップが欠けているのか一生わかりません。

4

1 に答える 1

3

あなたが見ているものは不可能です。GLSL バージョン 1.10 はlayout構文をまったくサポートしていません。したがって、コンパイラはシェーダーを拒否しているはずです。したがって、コンパイラがシェーダーを拒否していないために壊れているか、自分が思っているシェーダーをロードしていません。

GLSL バージョン 3.30 以降 (属性インデックスの構文をサポートする最初のコア バージョン) を使用しても機能しない場合layout(location=#)は、別のバグが原因です。つまり、互換性プロファイルは、頂点配列でレンダリングするには、属性 0 または のいずれかを使用する必要があることを暗黙的に示していますgl_Vertex。コア プロファイルにはそのような制限はありません。ただし、この制限はしばらくの間 GL にあったため、一部の実装では、それが存在しないコア プロファイルであっても、引き続き適用されます。

したがって、属性ゼロを使用してください。または、コア プロファイルをまだ使用していない場合は、コア プロファイルに切り替えることもできます (ただし、実装が実際に区別を正しく実装している場合は驚くでしょう。一般に、互換性が緩すぎるか、コアが制限されすぎます)。

于 2013-07-28T20:41:29.830 に答える