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

标签 c++ opengl glsl shader

图片是小(黑色)正方形,应该是彩虹色的(将颜色从一种颜色换成另一种颜色),但为什么它变成黑色是愚蠢的。

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

下面是绘制一个黑色小方 block 的代码。

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.fragbasic.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

最佳答案

在您的着色器代码中,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);
}

关于c++ - 颜色在启动示例 opengl 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083836/

相关文章:

java - Libgdx SpriteBatch.draw() 指定 4 个顶点

objective-c - 2个着色器使用相同的顶点数据

c++ - 从AVL树中删除指向1个或多个值的键

c++ - C++ : what's better? 的开源开发环境

c++ - 分析.WAV文件

c++ - 如何正确设置 SSBO 的提示以从着色器和 cpu 读取和写入?

c++ - 复制省略和异常(exception)

c++ - OpenGL 深度测试不起作用

c - 从C中的堆栈中删除字符串

c++ - glUseProgram() 和速度之后 uniform 的行为