LWJGL顶点着色器gl_PointSize无效。

7

我想在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(),它仍然会被使用。


1
尝试调用 glGet(GL_POINT_SIZE_RANGE) 以查看您的计算机支持的最大大小是多少。来源:http://www.opengl.org/sdk/docs/man/xhtml/glPointSize.xml - Anton D
glGetFloat(GL_POINT_SIZE_RANGE) 返回 1.0,真是让人郁闷。但在这种情况下,我可以用 java 的 glPointSize(10.0f) 将值改为 10.0,这不奇怪吗?点的渲染也变大了,所以我的硬件应该支持,尽管 glGet 说不支持... 另外,谢谢你的快速回复。 - Mattias F
2个回答

2
据我所知,您应该启用的状态称为GL_PROGRAM_POINT_SIZE,而不是GL_VERTEX_PROGRAM_POINT_SIZE。对您有影响吗?

那没起作用。仍然无法从着色器改变大小。 - Mattias F

-1

我在使用OpenGL2ES2时遇到了问题。

在顶点着色器中,设置gl_PointSize值根本没有任何效果。 相反,线的宽度可以指定并且可以工作。 我不确定原因是什么,但似乎点不太好处理/不属于GL2ES2的一部分。

没有办法指定点的大小,但确实需要这样做,我不得不使用一种有点hacky的方法。我对此并不特别自豪,但这完全可以解决问题。

想法是将线用作点...是的。 例如,要在位置(X,Y)上拥有6px宽度的点,您只需从(X-width / 2,y)绘制宽度为6px的线到(X + width / 2,y)。 当然,您必须根据与相机/缩放的距离调整线的长度。

正如我所说,我并不自豪,但是这样做即使将数据量加倍也可以工作。总比使用精灵好。


我同意,那是一种很hacky的解决方案。我无法看出你如何使用glEnable(GL_POINT_SMOOTH)来获得平滑的点,但它可能适用于矩形点,但那样的话我会只使用四边形^^一开始我以为你会使用线条来指定第一个条目数据作为位置和其他两个数据中的第一个作为大小,然后在几何着色器中使用它来创建一个点或其他什么...那才是hacky! - Mattias F
同意你的看法,这是一个非常笨重的解决方案。我需要点来进行可视化调试,不需要点平滑。 这仍然具有使用比四边形少(一点)数据和与我的调试线批处理的好处。 - Monsieur Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接