0

openGLGLSLをブラッシュアップするための基本的なシェーダープログラムを作成しました。

CPU側では、シェーダープログラム.vpと.fpを適切にリンクし、エラーチェックを行いました。

レンダリングしたときの結果は常に黒い三角形です

プログラムをリンクする直前ですが、両方のシェーダーをアタッチした後、これを行います

glBindAttribLocation( program, 0, "vVertexPos" );
glBindAttribLocation( program, 1, "vColor" );

シェーダー内の位置変数と色変数の両方

これらはすべて簡単に実行できるので、openGL呼び出しとシェーダー設定以外の醜いコードについて心配する必要はありません。

struct PosColVertex
{
    float pos[3];
    float color[4];
};

PosColVertex verts[3];
float vPos1[3] = { 0.5f, 0.0f, -1.0f };
float vPos2[3] = { 0.0f, 1.0f, -1.0f };
float vPos3[3] = { -0.5f, 0.0f, -1.0f };
memcpy( verts[0].pos, vPos1, sizeof(float)*3 );
memcpy( verts[1].pos, vPos2, sizeof(float)*3 );
memcpy( verts[2].pos, vPos3, sizeof(float)*3 );

float vColor1[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
float vColor2[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
float vColor3[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
memcpy( verts[0].color, vColor1, sizeof(float)*4 );
memcpy( verts[1].color, vColor2, sizeof(float)*4 );
memcpy( verts[2].color, vColor3, sizeof(float)*4 );

glGenBuffers( 1, &vboHandle );
glBindBuffer( GL_ARRAY_BUFFER, vboHandle );
glBufferData( GL_ARRAY_BUFFER, sizeof(PosColVertex)*3, verts, GL_DYNAMIC_READ );

私のレンダリングでは、これが私が行うことです

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

//use our shader program
glUseProgram( program );

//set which vertices we will be using
glBindBuffer( GL_ARRAY_BUFFER, vboHandle );

glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );

//specify our vertex attribute
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, sizeof( PosColVertex ), (void*)(0) );

//specify our texture attribute
glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, sizeof( PosColVertex ), (void*)(12) );

glPushMatrix();

//draw our rectangle
glDrawArrays( GL_TRIANGLES, 0, 3 );

glPopMatrix();

glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 1 );

glVertexAttribPointerの呼び出しで何か問題がありましたか?シェーダーが機能することを確認しましたが、テストする前にシェーダーに値をハードコーディングしたため、値が変更されます。しかし、CPU側のopenGLに私の頂点を正しく読み取る方法を教えていないことを前提としています。何か助けはありますか?

tri.vp

#version 330

in vec3 vVertexPos;

void main(void) 
{ 
    gl_Position = vec4( vVertexPos.x, vVertexPos.y, vVertexPos.z, 1 );
}

tri.fp

#version 330

out vec4 vFragColor;
in vec4 vColor;

void main(void)
{ 
   vFragColor = vColor;
}
4

1 に答える 1

3

フラグメントシェーダー内の属性にアクセスすることはできません。頂点シェーダー内でのみアクセスできます。これは、フラグメントごとではなく、頂点ごとに色を指定しているため、理にかなっています。したがって、コードを変更して、頂点シェーダーの色を読み取り、フラグメントシェーダーにスムーズに出力することをお勧めします。

バーテックスシェーダー:

in vec3 vVertexPos;
in vec4 vColor;

smooth out vec4 fColor;

void main(void) 
{ 
    gl_Position = vec4( vVertexPos.x, vVertexPos.y, vVertexPos.z, 1 );
    fColor = vColor;
}

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

smooth in vec4 fColor;
out vec4 vFragColor;

void main(void)
{ 
   vFragColor = fColor;
}
于 2012-11-12T15:40:54.917 に答える