颜色在开始示例opengl中不起作用

Posted

技术标签:

【中文标题】颜色在开始示例opengl中不起作用【英文标题】:Color does not work in starting examples opengl 【发布时间】:2019-01-08 00:39:52 【问题描述】:

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

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

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

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

【问题讨论】:

着色器代码有什么作用? 请使用 basic.vert 和 basic.frag 中的代码编辑您的帖子。 @Anonymous1847 插入着色器:3 @Rabbid76 插入着色器:3 【参考方案1】:

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

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

#version 330 core

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

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

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

【讨论】:

以上是关于颜色在开始示例opengl中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

照明在opengl中不起作用[关闭]

div中的背景颜色在iphone中不起作用

为 glm 翻译添加统一向量在 OpenGL 中不起作用

着色器在 2d OpenGL 中不起作用

在 OpenGL 中设置透明背景颜色不起作用

为啥我的链接颜色关键帧动画在 Chrome 中不起作用?