0

私は多くの論文やブログを見てきましたが、最終的にクワッドを生成するこれらのコードにたどり着きました: gProgram のプログラムストア

    vert shader:---------------------
    #version 330
    layout(location = 0) in vec3 attrib_position;  
    layout(location = 6) in vec2 attrib_texcoord;  
    out Varing
    {
        vec4    pos;
        vec2    texcoord;
    } VS_StateOutput;

    uniform mat4 gtransform;
    void main(void)
    {
        VS_StateOutput.pos = gtransform * vec4(attrib_position,1.0f);
        VS_StateOutput.texcoord = attrib_texcoord;
    }

    frag shader:--------------------
    #version 330
    uniform sampler2D texUnit;

    in  Varing
    {
        vec4    pos;
        vec2    texcoord;
    } PS_StateInput;
    layout(location = 0) out vec4 color0;
    void main(void)
    {
        color0 = texture(texUnit, PS_StateInput.texcoord);
    }

ここに私の頂点データがあります: gVertexVBO に格納します

    float data[] =
    { 
        -1.0f,  1.0f, 0.0f,   0.0f, 0.0f,
         1.0f,  1.0f, 0.0f,   1.0f, 0.0f,
         1.0f, -1.0f, 0.0f,   1.0f, 1.0f,
        -1.0f, -1.0f, 0.0f,   0.0f, 1.0f
    };

インデックス データ: gIndexVBO に格納

    unsigned short idata[] =
    {
        0, 3, 2,  0, 2, 1
    };

描画セクションでは、私はこれが好きです:

ps: gtransform は恒等行列として設定されます

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        
    glUseProgram(gProgram);        
    glProgramUniformMatrix4fv(gProgram, gtLoc, 1, GL_FALSE, matrix);
    glProgramUniform1uiv(gProgram, texLoc, 1, &colorTex);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexVBO);

    glBindBuffer(GL_ARRAY_BUFFER, gVertexVBO);
    char* offset = NULL;
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*5, offset);
    glEnableVertexAttribArray(0);

    glVertexAttribPointer(6, 2, GL_FLOAT, GL_FALSE, sizeof(float)*5, offset+sizeof(float)*3);
    glEnableVertexAttribArray(6);

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, NULL);  

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(6);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

これらのコード内にエラーがあると思いますが、どこにあるのかわかりません。助けていただければ幸いです。

初期化セクションでコードを確認する必要がある場合は、返信に投稿します。ありがとうございます!

4

1 に答える 1

2

gl_Position頂点シェーダーに組み込まれているものを提供していません。

uniform mat4 gtransform;
void main(void)
{
    vec4 outPosition = gtransform * vec4(attrib_position,1.0f);
    gl_Position = outPosition;
    // if you need the position in the fragment shader
    VS_StateOutput.pos = outPosition;
    VS_StateOutput.texcoord = attrib_texcoord;
}

OpenGLVS_StateOutputは構造体を認識せず、新しい頂点を配置する場所がわかりません。クイック リファレンスについては、こちらを参照してください。(7ページ)

このリンクは、組み込み構造の詳細を提供します。

編集:

次に、フラグメント シェーダーのメインを次のように変更します。

void main(void)
{
    color0 = vec4(1.0); //texture(texUnit, PS_StateInput.texcoord);
}

テクスチャの問題を除外します。テクスチャの問題により、空白の黒いテクスチャが発生することがあります。白い色が表示された場合は、テクスチャの問題であることがわかり、代わりにそこを見ることができます。

于 2013-08-29T09:17:17.453 に答える