我想在不使用任何纹理的情况下在openGL中对对象进行着色。我希望基于整数颜色代码为对象着色。执行此操作的最佳方法是什么(在java中)?
答案 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}}匹配,以及指定颜色表。