LWJGL顶点着色器gl_PointSize无法正常工作

时间:2013-09-22 20:36:12

标签: java opengl shader lwjgl glpointsize

我正在尝试更改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(),也会使用它。

2 个答案:

答案 0 :(得分:0)

据我所知,你应该glEnable的状态称为GL_PROGRAM_POINT_SIZE,而不是GL_VERTEX_PROGRAM_POINT_SIZE。这对你有影响吗?

答案 1 :(得分:0)

我遇到了使用OpenGL2ES2的问题。

在顶点着色器中,设置gl_PointSize值完全没有效果。 相反,可以指定线宽,并且它正在工作。 我不确定这个的原因,但似乎有点处理得不好/不属于GL2ES2。

无法指定点的大小,但实际上必须使用,我不得不使用一种有点hacky的方式。我并不为此感到特别自豪,但这完全可以解决问题。

这个想法是用线作为点......是的。 例如,要获得6px宽度的点,在位置(X,Y)处,您只需要从(X宽度/ 2,y)到(X +宽度/ 2,y)绘制宽度为6px的线。 当然,您必须根据与相机/变焦的距离来调整线条的长度。

正如我所说,我并不感到骄傲,但即使数据量增加一倍,这也行得通。总是比使用精灵更好。