0

glVertexAttribPointer() を使用して、頂点シェーダーにデータを提供しようとしています。問題は、FIRST属性でのみ機能していることです...

ここに私のOpenGLコードがあります:

struct Flag_vertex
{
    GLfloat position_1[ 8 ];
    GLfloat position_2[ 8 ];
};

Flag_vertex flag_vertex;

   ... // fill some data to flag_vertex

GLuint vertexbuffer_id;
glGenBuffers( 1, &vertexbuffer_id );
glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer_id );
glBufferData( GL_ARRAY_BUFFER, sizeof(flag_vertex), &flag_vertex, GL_STATIC_DRAW );

glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );

glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer_id );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1) );
glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2) );

私のシェーダーは次のようなものです:

#version 420 core

layout(location = 0) in vec2 in_position_1;
layout(location = 1) in vec2 in_position_2;

out vec2 texcoord;

void main()
{
    gl_Position = vec4(in_position_X, 0.0, 1.0);
    texcoord = in_position_X * vec2(0.5) + vec2(0.5);
}

「in_position_1」を使用するとテクスチャは完全にレンダリングされますが、in_position_2 を使用すると何も起こりません...

ヒント: 私がやっているシェーダーをリンクする前に:

glBindAttribLocation( programID, 0, "in_position_1");
glBindAttribLocation( programID, 1, "in_position_2");

最初のストリームでのみ機能するのはなぜですか? 頂点に送るデータがもっと必要です...色などを送る必要があります...何かヒントはありますか?

4

1 に答える 1

0
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1) );
glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2) );

これらの行は意味がありません。少なくとも、 howFlag_vertexが定義されているわけではありません。Flag_vertexが本当に頂点である(四角形ではない) 場合、8 つの float を持つことは意味がありません。それぞれFlag_vertexが完全なクワッドを定義している場合は、間違った名前を付けています。それはまったく頂点ではありませんFlag_quad

そのため、ここで何を達成しようとしているのかを知ることさえ困難です。

また:

「in_position_1」を使用するとテクスチャは完全にレンダリングされますが、in_position_2 を使用すると何も起こりません...

もちろんそうです。位置データは属性 0 にあります。したがって、位置データは属性 1 にはありません。属性 1 に位置データがあることが明らかではないのに、あるふりをすると、妥当な結果が得られません。

問題は、両方を使用する必要があるときに、常に属性 0 を使用していることです。どちらかを選んではいけません。in_position_1位置とin_position_2テクスチャ座標に使用します。そして、彼らが何をするかに基づいて、それらに合理的な名前を付けてみてください(または何かのようpositionに)。texture_coordそれらに数字を使用しないでください。

ヒント: 私がやっているシェーダーをリンクする前に:

layout(location=#)これは、シェーダーでの設定とまったく同じです。シェーダーに入れたい場合は、シェーダーに入れます。OpenGL コードでそれが必要な場合は、OpenGL コードに入れます。両方の場所に置かないでください。

于 2013-01-24T19:58:45.790 に答える