如何在openGL中没有纹理的情况下为对象着色

时间:2014-09-16 19:17:29

标签: java opengl jogl

我想在不使用任何纹理的情况下在openGL中对对象进行着色。我希望基于整数颜色代码为对象着色。执行此操作的最佳方法是什么(在java中)?

1 个答案:

答案 0 :(得分:2)

有几种不同的方法可以为三角形着色。传统上,在OpenGL中着色基元意味着为每个顶点指定一种颜色,然后在整个基元上进行插值。您还可以使用片段着色器中读取的统一变量指定颜色。第一种方法更灵活,但每个顶点需要更多数据。如果所有对象都是相同的颜色,则通过均匀颜色指定颜色很好,但可能需要对不同颜色进行大量(可能很慢)状态更改。您使用整数颜色代码指定的方法介于两者之间。

这是创建每个顶点颜色的顶点缓冲区对象的一种方法(如果任何语法错误,我很抱歉,因为我很长时间没有编写任何Java,所以我&# 39; m主要是从C ++转换它:

glBindBuffer(GL_ARRAY_BUFFER, VBO);
ArrayList<vertex> vertexData;
<.....fill vertex data.....>

struct GPUVertex{
    GLfloat position[4];
    GLfloat color[4];
}
ArrayList<GPUVertex> VBOData = new ArrayList<GPUVertex>(vertexData.size());

for(int i=0; i<vertexData.size(); i++){
    VBOData[i].position[0] = vertexData[i].x;
    VBOData[i].position[1] = vertexData[i].y;
    VBOData[i].position[2] = vertexData[i].z;
    VBOData[i].position[3] = 1.0;

    VBOData[i].color[*] = ...some color...
}

glBufferData(GL_ARRAY_BUFFER, VBOData.size()*sizeof(GPUVertex), &(VBOData[0]), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

然后,当你去渲染时,只需确保在绑定VBO进行绘制时调用glEnableVertexAttribArray(0/1)glVertexAttribPointer(0/1, 3, GL_UNSIGNED_INT, 24, 0/12)。然后,确保向顶点着色器添加额外的layout(location=1) in vec3 vertColor,以及将结果传递给片段着色器的out vec4 fragColor之类的变量。

要将此方法用于整数颜色代码,您可以将GLfloat color[4]结构中的GPUVertex更改为整数颜色代码,然后更改glVertexAttribPointer(...)layout(location=1)...和{ {1}}匹配,以及指定颜色表。