颜色在启动示例opengl中不起作用

时间:2019-01-08 00:39:52

标签: c++ opengl glsl

图片为小(黑色)正方形,应呈虹彩(将一种颜色更改为另一种颜色),但为什么它变成黑色却很愚蠢。

因此它是绘制出来的,而不是抛出错误。

这是绘制一个黑色小方块的代码。

basic.vert和basic.frag标准的起始教科书(第一册)。

void My_TwoSquares()
{
    GLfloat vertires[] =
    {
        -0.2f, -0.2f, 0.0f,
        -0.2f, 0.2f, 0.0f,
        0.2f, 0.2f, 0.0f,
        0.2f, -0.2f, 0.0f,
    };
     // color 
    GLfloat cwet[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f
    };

    GLuint indices[] =
    {
        0,1,2, 
        0,2,3  
    };

    GLuint iboHandle;
    GLuint vaoHandle;
    GLuint vboHandles[2];

    glGenBuffers(2, vboHandles);
    GLuint positionBufferHandle = vboHandles[0];
    GLuint colorBufferHandle = vboHandles[1];

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
    glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), vertires, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
    glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), cwet, GL_STATIC_DRAW);

    glGenVertexArrays(1, &vaoHandle);
    glBindVertexArray(vaoHandle);

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    glGenBuffers(1, &iboHandle);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboHandle);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLuint), indices, GL_STATIC_DRAW);

    ShaderProgram shaderprogram;
    shaderprogram.loadShaders("basic.vert", "basic.frag");
    shaderprogram.use();

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

}

这是着色器 basic.frag basic.vert

basic.frag

#version 330 core

uniform vec4 vertColor;
out vec4 frag_color;

void main()
{
    frag_color = vertColor;
}

basic.vert

#version 330 core

layout (location = 0) in vec3 pos;

uniform vec2 posOffset;

void main()
{
        gl_Position = vec4(pos.x + posOffset.x, pos.y + posOffset.y, pos.z, 1.0);
}

enter image description here

1 个答案:

答案 0 :(得分:3)

在着色器代码中,vertColor是一个Uniform变量。永远不会设置此统一变量,并且所有组件的统一变量的默认初始化为0。这导致矩形被涂成黑色。

但是您具有顶点属性。每个顶点坐标都与一种颜色相关联。您必须为颜色属性(Vertex Shader)添加一个输入到Vertex shader input

#version 330 core

layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;

此属性必须通过顶点着色器(Fragment Shader)的输出传递到Vertex shader output

out vec3 vColor;

void main()
{
    vColor = color;
    // [...]
}

到片段着色器(Fragment shader input)的输入:

in vec3 vColor;

根据其在(三角形)图元(Barycentric coordinates)上的位置对顶点着色器的输出(如颜色)进行插值。片段着色器的输入是插值属性。
通过这种技术,可以实现渐变色。

顶点着色器

#version 330 core

layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 color;

out vec3 vColor;

uniform vec2 posOffset;

void main()
{
    vColor      = color;
    gl_Position = vec4(pos.x + posOffset.x, pos.y + posOffset.y, pos.z, 1.0);
}

片段着色器

#version 330 core

in  vec3 vColor;
out vec4 frag_color;

void main()
{
    frag_color = vec4(vColor.rgb, 1.0);
}