我正在尝试更改 LWJGL 中顶点着色器中点的大小,但无法使其正常工作。如果我尝试从着色器更改点大小,点大小始终为 1px。
顶点着色器:
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);
澄清一下:我可以渲染所有的点,一切都很好,但点的大小始终是 1px。我也没有使用平滑点。
编辑: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,因为它使用 glPointSize() 如果它存在于 java 代码中。据我了解,如果启用了 GL_PROGRAM_POINT_SIZE,所有对 glPointSize() 的调用都将被忽略,并且程序希望着色器设置该值,但即便如此,如果代码中存在 glPointSize() ,则会使用它。