繁体   English   中英

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

[英]LWJGL vertex shader gl_PointSize not working

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

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

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

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

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

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

正如我所说的那样,我并不自豪,但即使数据量增加一倍,这种方法仍然有效。 总是比使用精灵更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM