2

GLSL を学習しようとしていて、float 属性を頂点シェーダーに送信したいと考えています。今のところ、この float は単に明るさを設定するために使用されます (in_Light で in_Color を乗算し、out_Color に割り当てます)。明るさは、何を渡そうとしても、頂点シェーダーでは常に 1.0 に等しいようです (以下のコードでは 0.1)。私はグーグルを試してみましたが、かなり実験を試みましたが、何が悪いのかわかりません。位置、テクスチャ座標、および色は正常に機能しているようです。

属性の場所をバインドする方法と、もう少しコードを次に示します。

    this.vsId = Shader.loadShader(pVertexFilePath, GL20.GL_VERTEX_SHADER);
    this.fsId = Shader.loadShader(pFragmentFilePath, GL20.GL_FRAGMENT_SHADER);

    this.pId = GL20.glCreateProgram();
    GL20.glAttachShader(this.pId, this.vsId);
    GL20.glAttachShader(this.pId, this.fsId);

    GL20.glBindAttribLocation(this.pId, 0, "in_Position");
    GL20.glBindAttribLocation(this.pId, 1, "in_TextureCoord");
    GL20.glBindAttribLocation(this.pId, 2, "in_Color");
    GL20.glBindAttribLocation(this.pId, 3, "in_Light");

    GL20.glLinkProgram(this.pId);

    this.normalMatrixId = GL20.glGetUniformLocation(this.pId, "normalMatrix");
    this.projectionModelViewMatrixId = GL20.glGetUniformLocation(this.pId, "projModelViewMatrix");

これは、各属性の位置を設定する方法です

    FloatBuffer verticesFloatBuffer = BufferUtils.createFloatBuffer(verticesCount * 36);
    for (VertexData vert : vertices) {verticesFloatBuffer.put(vert.getElements());}
    vertices.clear();
    verticesFloatBuffer.flip();

    GL30.glBindVertexArray(vaoId);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesFloatBuffer, GL15.GL_STATIC_DRAW);

    GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 36, 0);
    GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, 36, 12);
    GL20.glVertexAttribPointer(2, 3, GL11.GL_FLOAT, false, 36, 20);
    GL20.glVertexAttribPointer(3, 1, GL11.GL_FLOAT, false, 36, 32);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

これは上記で使用した getElements メソッドです (テスト目的で色と明るさを手動で入力しました)。in_Light である必要がある最後の値は 0.1f であり、頂点シェーダーでは常に 1.f になることに注意してください。

public float[] getElements() {
    return new float[]{this.x, this.y, this.z, this.s, this.t, 1.f, 0.f, 1.f, 0.1f};
}

頂点シェーダー:

#version 430 core

uniform mat4 projModelViewMatrix;
uniform mat3 normalMatrix;

in vec3 in_Position;
in vec2 in_TextureCoord;
in vec3 in_Color;
in float in_Light;

out vec4 pass_Color;
out vec2 pass_TextureCoord;

void main(void) {
    gl_Position = projModelViewMatrix * vec4(in_Position, 1.0);

    pass_TextureCoord = in_TextureCoord;

    pass_Color = vec4(in_Color * in_Light, 1.0);
}

Fragment Shader (誰かがそれを見たい場合に備えて):

#version 430 core

uniform sampler2D texture_diffuse;

in vec4 pass_Color;
in vec2 pass_TextureCoord;

out vec4 out_Color;

void main(void) {
    out_Color = texture2D(texture_diffuse, pass_TextureCoord) * pass_Color;
}

頂点シェーダーに渡す他のすべての属性は正常に機能します。

編集:メモとして、シェーダーを変更して場所を指定しようとしました。

layout (location = 0) in vec3 in_Position;

また、同じ属性の場所 (0、1、2、3) を提供する glGetAttributeLocation も使用しました。

GL20.glGetAttribLocation(this.pId, "in_Position");

また、シェーダーに if ステートメントを追加して in_Light の値をチェックすると、常に 1 になります。

EDIT2: color 属性を vec4 に変更し、alpha の代わりに light 値を渡しました。これは正常に機能します。他の試練も含めて、何故か3つ以上の属性は持てないらしい。

4

2 に答える 2

0

ええ、ニコル・ボーラスが言及したものに加えて、単純な初心者の間違いです。(あと何個あるのかな ;)

glVertexAttribPointer で各属性の位置を設定する前に、glEnableVertexAttribArray を追加する必要がありました。最初の 3 つの属性は自動的に有効になっているようですが、これは GPU ごとに変わるのでしょうか?

FloatBuffer verticesFloatBuffer = BufferUtils.createFloatBuffer(verticesCount * 36);
for (VertexData vert : vertices) {verticesFloatBuffer.put(vert.getElements());}
vertices.clear();
verticesFloatBuffer.flip();

GL30.glBindVertexArray(vaoId);

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesFloatBuffer, GL15.GL_STATIC_DRAW);

GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL20.glEnableVertexAttribArray(2);
GL20.glEnableVertexAttribArray(3);

GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 36, 0);
GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, 36, 12);
GL20.glVertexAttribPointer(2, 3, GL11.GL_FLOAT, false, 36, 20);
GL20.glVertexAttribPointer(3, 1, GL11.GL_FLOAT, false, 36, 32);

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

答えてくれたみんなありがとう!

于 2013-08-30T14:08:53.197 に答える