4

実行中のシェーダー プログラムに頂点属性を渡すときに問題が発生します。位置と RGBA カラーの 2 つの属性を渡したいと思います。属性の場所をバインドすると、位置に対して機能します。ただし、カラーには対応していません。したがって、すべてのジオメトリは最終的に黒くレンダリングされます。

これが私がすることです:

GLuint programHandler;

// create program
// compile & attach vertex shader
// compile & attach fragment shader

glBindAttribLocation(programHandler, 0, "InPosition");
glBindAttribLocation(programHandler, 1, "InColor");
glBindFragDataLocation(programHandler, 1, "FragColor");

glLinkProgram(programHandler);
glUseProgram(programHandler);

// initialize uniform variables

// I'm trying to get the attribute locations now.
// I expect location "0" for InPosition and location "1" for InColor.
// In fact, it gets me a "-1" for InColor. I simply cannot see the reason for that behaviour

GLint positionLocation = glGetAttribLocation(programHandler, "InPosition"); // returns 0
GLint colorLocation = glGetAttribLocation(programHandler, "InColor"); // returns -1

glEnableVertexAttribArray(positionLocation);
glEnableVertexAttribArray(colorLocation); // fails!

私の頂点シェーダーは非常に基本的なものです。私が実際に行っているのは、頂点を変換し、色をフラグメント シェーダーに渡すことだけです。

#version 150 core

// input
uniform mat4 ModelviewMatrix;
uniform mat4 ProjectionMatrix;
in vec3 InPosition;
in vec4 InColor;

// output
out vec4 PassColor;

void main(void) {
    // passing color through to fragment shader
    PassColor = InColor;

    // transformation
    gl_Position = ProjectionMatrix * ModelviewMatrix * vec4(InPosition, 1.0);
}

私のフラグメント シェーダーは単にその色を返す必要があります。

#version 150 core
precision highp float;

// input
in vec4 PassColor;

// output
out vec4 FragColor;

void main(void) {
    FragColor = PassColor;
}

バインディング「InPosition」が機能し、「InColor」が機能しないのはなぜですか? GLSL コンパイラがシェーダー コードを最適化するため、未使用の変数をバインドできないことは承知しています。しかし、ここで色を最適化する必要がある理由がわかりません。結局、フラグメントシェーダーに渡して使っています。

4

1 に答える 1

1

ブラインドショット、これは間違っていると思います:

glBindFragDataLocation(programHandler, 1, "FragColor");

そのはず:

glBindFragDataLocation(programHandler, 0, "FragColor");
于 2010-12-07T03:00:25.570 に答える