OpenGL ES 3.0 GL_POINTS 不渲染任何东西

OpenGL ES 3.0 GL_POINTS doesn't render anything

下面是一个最小的复制器:

  GL_CHECK(glClearColor(0.4f, 0.4f, 0.4f, 1.0f));
  GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
                   GL_STENCIL_BUFFER_BIT));
  GL_CHECK(glUseProgram(this->pp_->shader_program));
  GL_CHECK(glEnable(GL_TEXTURE_2D));
  GL_CHECK(glActiveTexture(GL_TEXTURE0));
  GL_CHECK(glBindTexture(GL_TEXTURE_2D, this->particle_->id));
  GLfloat points[] = { 150.f, 150.f, 10.0f, 150.0f, 175.0f, 10.0f };
  GLfloat colors[] = { 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f };
  shader_pass_set_uniform(this->pp_, HASH("mvp"), glm::value_ptr(this->camera_));
  GL_CHECK(glEnableVertexAttribArray(0));
  GL_CHECK(glEnableVertexAttribArray(3));
  GL_CHECK(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, &points[0]));
  GL_CHECK(glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 0, &colors[0]));
  GL_CHECK(glDrawArrays(GL_POINTS, 0, 2));

顶点着色器:

#version 300 es

layout(location = 0) in highp vec3 vertex;
layout(location = 3) in highp vec4 color;

out lowp vec4 vcolor;

uniform mat4 mvp;

void main()
{
   vcolor               = color;
   gl_Position          = mvp * vec4(vertex.xy, 0.0, 1.0);
   gl_PointSize         = vertex.z;
}

片段着色器:

#version 300 es

uniform sampler2D stexture;
in lowp vec4 vcolor;

layout(location = 0) out lowp vec4 ocolor;

void main()
{ 
    ocolor = texture(stexture, gl_PointCoord) * vcolor;    
}

屏幕上未呈现任何内容,可以找到我的 glxinfo in this pastebin。当我将相同的纹理渲染到三角形上时它起作用了。

这也是使用 apitrace 捕获的渲染循环:

250155 glClearColor(red = 0.5, green = 0.5, blue = 0.5, alpha = 1)
250157 glClear(mask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT)
250159 glUseProgram(program = 9)
250161 glEnable(cap = GL_TEXTURE_2D)
250163 glActiveTexture(texture = GL_TEXTURE0)
250165 glBindTexture(target = GL_TEXTURE_2D, texture = 2)
250167 glUniformMatrix4fv(location = 0, count = 1, transpose = GL_FALSE, value = {0.001953125, 0, 0, 0, 0, 0.002604167, 0, 0, 0, 0, -1, 0, -1, -1, -0, 1})
250168 glEnableVertexAttribArray(index = 0)
250170 glEnableVertexAttribArray(index = 3)
250174 glVertexAttribPointer(index = 0, size = 3, type = GL_FLOAT, normalized = GL_FALSE, stride = 0, pointer = blob(24))
250175 glVertexAttribPointer(index = 3, size = 4, type = GL_FLOAT, normalized = GL_FALSE, stride = 0, pointer = blob(32))
250176 glDrawArrays(mode = GL_POINTS, first = 0, count = 2)
250178 glXSwapBuffers(dpy = 0x1564010, drawable = 50331661)

我想这可能意味着,您的 GLES 实现支持的磅值范围可能不是您所期望的。您可以尝试类似的操作:

GLint range[2];
glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, range); // for example, (1, 511) in my implementation

去看看。任何实现都保证 range[1] 至少是 1.0。值 gl_PointSize 被限制在范围内,因此在最坏的情况下,您将无法设置大小大于 1 的点。在这种情况下,gl_PointCoord 似乎评估为 (1, 0)(根据规范中的公式)在唯一的片段中,将为每个点绘制。在纹理的环绕模式开始发挥作用后,(1, 0) 可能会变成 (0, 0),例如,如果您使用 GL_REPEAT 作为纹理的环绕模式。如果您想安全地绘制边长大于 1 的点,您应该尝试使用普通方法绘制正方形(例如使用四个顶点和 GL_TRIANGLE_FANGL_TRIANGLE_STRIP 模式)。