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;
}

OpenGL 不会知道您的VS_StateOutput结构,也不知道将新顶点放在哪里。请参阅此处以获取快速参考。(第 7 页)

此链接提供了内置结构的更好细节。

编辑:

接下来,我会将片段着色器主要更改为:

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

排除任何纹理问题。有时纹理问题会导致空白的黑色纹理。如果你得到一个白色的颜色,你就会知道它的纹理问题,可以去那里看看。

于 2013-08-29T09:17:17.453 回答