我想在LWJGL中的顶点着色器中改变点的大小,但无法使其生效。如果我尝试从着色器中改变点的大小,它的大小始终为1像素。
顶点着色器:
void main(){
gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
gl_PointSize = 10.0;
}
片元着色器:
void main(){
gl_FrontColor = gl_Color;
}
绘制代码:
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, p_vbo);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, c_vbo);
glColorPointer(4, GL_FLOAT, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_POINTS, 0, particles_num);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
我的目标是动态更改点的大小,但我无法从着色器中更改点的大小。如果我调用以下代码:
glPointSize(10.0f);
从Java中,大小会发生变化,但我希望能够针对每个点进行更改。我已经启用了我的着色器以改变点的大小:
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
为了澄清:我可以渲染所有的点,一切都工作得很好,但点的大小始终为1像素。我也没有使用平滑点。
编辑: glGetFloat(GL_POINT_SIZE_RANGE)返回1.0,这应该表示我的硬件不支持除1.0以外的其他点大小。但是,如果我修改我的绘制代码:
glDrawArrays(GL_POINTS, 0, particles_num);
收件人:
for (int i = 0; i < particles_num; i++) {
glPointSize(massBuff.get(i));
glDrawArrays(GL_POINTS, i, 1);
}
当massBuff包含1f - 10f的随机浮点数时,我得到了完全期望的结果,但性能较差。因此,显然我的硬件支持它,并且我仍然希望能够从着色器中实现这一点。
编辑: 我也尝试过:
glEnable(GL_PROGRAM_POINT_SIZE);
这也不起作用。程序的行为就像我从未启用GL_PROGRAM_POINT_SIZE一样,因为它在Java代码中使用glPointSize()。据我所知,如果启用了GL_PROGRAM_POINT_SIZE,所有对glPointSize()的调用都将被忽略,程序期望着着色器来设置该值,但即使如此,如果代码中存在glPointSize(),它仍然会被使用。