Java LWJGL顶点着色器gl_PointSize不工作

Java LWJGL顶点着色器gl_PointSize不工作,java,opengl,shader,lwjgl,glpointsize,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);

我试图在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);
致:


这也不起作用。该程序的行为就像我从未启用过GL_program_POINT_SIZE一样,因为它使用glPointSize(),如果它存在于java代码中的话。据我所知,如果启用了GL_PROGRAM_POINT_SIZE,那么对glPointSize()的所有调用都将被忽略,并且程序希望着色器设置该值,但即便如此,如果代码中存在glPointSize(),则会使用它。

据我所知,您应该可以使用的状态称为
GL_PROGRAM_POINT_SIZE
,不
GL\u顶点\u程序\u点\u大小
。这对您有影响吗?

我使用OpenGL2ES2解决了这个问题

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

由于没有办法指定点的大小,但确实不得不这样做,我不得不使用一种有点粗糙的方法。我并不为此感到特别自豪,但这完全起到了作用

想法是使用线作为点。。。对 例如,要有一个6px宽的点,在位置(X,Y)你只需要画一条6px宽的线,从(X-width/2,Y)到(X+width/2,Y)。 当然,您必须根据与摄影机/变焦的距离调整线条的长度


正如我所说,我并不感到骄傲,但是,即使数据量翻了一番,这种方法仍然有效。总是比使用精灵更好。

试着调用glGet(GL\u POINT\u SIZE\u RANGE)查看您电脑上支持的最大尺寸。来源:glGetFloat(GL\u POINT\u SIZE\u RANGE)返回1.0,该死。但是在这种情况下,我可以用java中的glPointSize(10.0f)将值更改为10.0,这不是很奇怪吗?点渲染也更大,所以它应该得到我的硬件的支持,即使你说的不是这样。。。顺便说一句,谢谢你的快速回复,没有什么不同。仍然无法更改着色器的大小。我同意,这是一种有点粗糙的解决方案。我看不出如何使用glEnable(GL_POINT_smooth)和解决方案获得平滑点,但它可能适用于矩形点,但我会使用四边形^^^^虽然在开始时,您会使用一条线指定第一个输入数据作为位置,并指定其他两个数据中的第一个作为大小,然后在几何体着色器中使用它来创建点或其他东西。。。那就太骇人了!恕我直言,这是一个非常庞大的解决办法。我需要点进行可视化调试,而点平滑是不必要的。这仍然有使用(一点)比四边形更少的数据以及可以批处理调试行的好处。
for (int i = 0; i < particles_num; i++) {
   glPointSize(massBuff.get(i));
   glDrawArrays(GL_POINTS, i, 1);
}
glEnable(GL_PROGRAM_POINT_SIZE);