我想渲染一组动态变化半径的圆圈,这些圆圈围绕一组点,其坐标存储在VBO中。到目前为止,我使用的是GL_POINT_SMOOTH,但现在已转移到OpenGL 4.0,此选项不再可用。我看到过类似的问题here,但这并不适合我的需要,因为该示例中圆圈的中心在片段着色器中是硬编码的。我该怎么做?
目前,我的顶点着色器看起来像这样:
#version 400
layout(location=0) in vec2 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;
uniform vec4 bounds;
void main(void){
float x = -1+2/(bounds.y-bounds.x)*(in_Position.x-bounds.x);
float y = -1+2/(bounds.w-bounds.z)*(in_Position.y-bounds.z);
gl_Position = vec4(x,y,0,1);
ex_Color = in_Color;
}
我的片段着色器看起来像这样:
#version 400
in vec4 ex_Color;
out vec4 out_Color;
void main(void){
out_Color = ex_Color;
}
使用这些着色器,我得到了平方点。
答案 0 :(得分:14)
"现代"绘制点的方式是这样的:
启用程序点大小模式:
glEnable(GL_PROGRAM_POINT_SIZE);
使用GL_POINTS
原始模式渲染顶点。
在顶点着色器中,将内置变量gl_PointSize
设置为所需的单个点大小:
gl_Position = ...;
gl_PointSize = ...;
如果此点大小始终相同,则该值可以是常量,如果您希望能够在绘制调用之间调整它,则可以是均匀值;如果点大小是每个点可变的,则可以是顶点属性
这将为由gl_PointSize
的值指定的大小的方点生成片段。在片段着色器中,您可以使用内置的gl_PointCoord
变量,该变量为您提供点内片段的相对坐标。它与纹理坐标非常相似,在每个方向上提供[0,1]的范围。
例如,如果您想要纹理点,这对粒子系统非常有用,片段着色器代码可以包含:
outColor = texture(particleTex, gl_PointCoord);
或者如果你想要圆点,你可以根据与中心的距离丢弃圆圈外的所有内容:
vec2 circCoord = 2.0 * gl_PointCoord - 1.0;
if (dot(circCoord, circCoord) > 1.0) {
discard;
}
或者类似地,您可以使圆圈外的碎片透明,并启用混合,以获得圆点。
请注意,支持的点大小范围取决于实现。您可以使用以下方式查询可用范围:
GLfloat sizeRange[2] = {0.0f};
glGetFloatv(GL_POINT_SIZE_RANGE, sizeRange);