【问题标题】:OpenGL ES 2.0 with iPhone: GL_POINT_SMOOTH draws squares with ES 2.0 but works in ES 1.0OpenGL ES 2.0 与 iPhone:GL_POINT_SMOOTH 使用 ES 2.0 绘制正方形,但在 ES 1.0 中有效
【发布时间】:2011-08-29 18:41:09
【问题描述】:

我正在尝试通过使用顶点缓冲区对象来绘制圆,并在 iPhone 上的 OpenGL ES 2.0 中启用 GL_POINT_SMOOTH 来绘制点。

我已经使用以下 ES 1.0 渲染代码在 iPhone 4 上成功绘制了圆圈:

glVertexPointer(2, GL_FLOAT, 0, circleVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS, 0, 1);

我现在尝试使用设置 VBO 后跟此 ES 2.0 渲染代码来实现相同的效果:

glEnable(GL_BLEND); 
glEnable(GL_POINT_SPRITE_OES);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glDrawElements(GL_POINTS, numPoints, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));

但是输出的顶点很明显是正方形的,而不是圆形的。

我尝试减少上面的“glEnable”和相关调用来模拟第一个工作版本,但输出没有明显变化;形状仍然是方形的。我还尝试将“glDrawElements”调用替换为:

    glDrawArrays(GL_POINTS,0,numPoints);

..但还是没有变化。

顶点着色器中设置点大小,着色器编译运行成功:

uniform mediump mat4 projMx;

attribute vec2 a_position;      
attribute vec4 a_color;     
attribute float a_radius;       
varying vec4 v_color;
void main()
{
    vec4 position = vec4(a_position.x,a_position.y,1.0,1.0);
    gl_Position = projMx * position;
    gl_PointSize = a_radius*2.0;
    v_color = a_color;
}

有谁知道为什么不使用 glDrawElements VBO 版本绘制圆圈?

【问题讨论】:

  • 嘿,是的,我解决了另一个问题并在另一个线程中回复了;)谢谢!
  • 只是为了澄清其他人:这个线程中的问题没有解决!

标签: shader opengl-es-2.0 geometry vertex


【解决方案1】:

那是因为你启用了 GL_POINT_SPRITE_OES,它用于绘制带有点的矩形,这对于广告牌很有用(它比使用 4 个顶点绘制矩形更简单快捷)。

尝试删除 glEnable(GL_POINT_SPRITE_OES);它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多