java - LWJGL 顶点着色器 gl_PointSize 不工作

标签 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);

澄清一下:我可以渲染我所有的点并且一切正常,但点大小始终为 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 的随机 float ,我得到了完全想要的结果,但性能较差。所以,我的硬件显然支持它,我仍然希望能够从着色器执行此操作。

编辑: 我也试过:

glEnable(GL_PROGRAM_POINT_SIZE);

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

最佳答案

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

关于java - LWJGL 顶点着色器 gl_PointSize 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948504/

相关文章:

java - 如何更改 ListView 中特定字符串的字体颜色和样式?

java - opengl/lwjgl 的透明度问题

c++ - 在中心位置渲染模型不显示(修订)

opengl - 着色器中如何引用纹理?

java - 自定义字体编码

Java:根据 HashMap 中的排序键显示值

opengl - Xlib:显示 "GLX"上缺少扩展 ":0"

java - 如何在 JavaFX 中使用 OpenGL?

ios - SCNShadable - 改变纹理的变量和样本

java - Gson抛出异常 "Expected BEGIN_OBJECT but was BEGIN_ARRAY"