opengl 如何在GLSL opegl中为立方体制作单色面

epggiuax  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(175)

我有一个旋转立方体

但它总是以这样一种方式渲染插值渐变色
我想用一种颜色给单面上色,正好一个三角形,如下图

我的GLSL
第一个
我的GLFW代码

glClearColor(1f, 1f, 1f, 1f)
        glClear(GL_COLOR_BUFFER_BIT.toUInt() or GL_DEPTH_BUFFER_BIT.toUInt())

        var time = glfwGetTime()
        glUniform1f!!(uniformTime, time.toFloat())

        glDrawElements(GL_TRIANGLES, verticesIndex.size, GL_UNSIGNED_SHORT, NULL)

        glfwSwapBuffers(window)
        glfwPollEvents()

我的颜色数组

[
0.8, 0.007315, 0.026764, 
0.01696, 0.8, 0.005661, 
0.007843, 0.001524, 0.8, 
0.01696, 0.8, 0.005661, 
0.007843, 0.001524, 0.8, 
0.01696, 0.8, 0.005661, 
0.007843, 0.001524, 0.8, 
0.01696, 0.8, 0.005661, 
0.007843, 0.001524, 0.8, 
0.01696, 0.8, 0.005661, 
0.007843, 0.001524, 0.8, 
0.01696, 0.8, 0.005661
]
yshpjwxd

yshpjwxd1#

通常的方法是创建具有颜色属性的网格,其中每个面都有其自己的顶点,这些顶点具有相同颜色的颜色属性。
或者,您可以尝试使用flat插值限定符:
该值将不会被插值。指定给片段着色器的值是来自该图元的激发顶点的值。
顶点着色器


# version 410 core

in vec3 position;
in vec3 color;

flat out vec3 outColor;

void main()
{
    outColor = color

    // [...]
}

片段着色器:


# version 410 core

flat in vec3 outColor;
out vec4 fragColor;

void main()
{
    fragColor = vec4(outColor, 1.0);
}

另一个选择是为每个三角形图元创建一个颜色数组,并将该颜色数组存储在Shader Storage Buffer Object中。使用gl_VertexID在顶点着色器中寻址颜色。

vec4 outColor;

layout(std430, binding = 0) buffer primitiveColors
{
    vec4 colors[];
};

void main()
{
    outColor = colors[gl_VertexID / 3];

    // [...]
}

相关问题