【问题标题】:LWJGL vertex shader gl_PointSize not workingLWJGL 顶点着色器 gl_PointSize 不起作用
【发布时间】:2013-09-22 20:36:12
【问题描述】:

我正在尝试更改 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);

澄清一下:我可以渲染我的所有点并且一切都很好,但点大小始终为 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,因为它使用 glPointSize() 如果它存在于 java 代码中。据我了解,如果启用了 GL_PROGRAM_POINT_SIZE,所有对 glPointSize() 的调用都将被忽略,并且程序希望着色器设置该值,但即便如此,如果代码中存在 glPointSize(),则会使用它。

【问题讨论】:

  • 尝试调用 glGet( GL_POINT_SIZE_RANGE ) 来查看您电脑上支持的最大尺寸是多少。来源:opengl.org/sdk/docs/man/xhtml/glPointSize.xml
  • glGetFloat(GL_POINT_SIZE_RANGE) 返回 1.0,该死的。但是在那种情况下,我可以使用java中的glPointSize(10.0f)将值更改为10.0,这不是很奇怪吗?这些点也渲染得更大,所以它应该得到我的硬件的支持,即使你 glGet 另有说法......顺便感谢您的快速回复

标签: java opengl shader lwjgl glpointsize


【解决方案1】:

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

【讨论】:

  • 这并没有什么不同。仍然无法从着色器更改大小。
【解决方案2】:

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

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

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

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

正如我所说,我并不感到自豪,但很好,即使数据量翻倍,这也有效。总是比使用精灵更好。

【讨论】:

  • 我同意,这是一种 hacky 解决方案。我看不出你如何使用 glEnable(GL_POINT_SMOOTH) 和你的解决方案获得平滑点,但它可能适用于矩形点,但我只会使用 quads^^ 我虽然在开始时你会使用一条线来指定第一个输入数据作为位置,其他两个中的第一个作为大小,然后在几何着色器中使用它来创建一个点或其他东西......那会很hacky!
  • 同意你的看法,这是一个非常庞大的解决方法。我需要点进行可视化调试,不需要点平滑。这仍然具有比四边形使用(稍微)更少的数据并且可以通过我的调试行进行批处理的好处。
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多