我希望使用OpengGL 4.0在X轴的有限空间内绘制2D网格。
我希望使用GLSL使用vert / frag着色器等来渲染灯光(使它们出现)。
可以使用较旧的OpenGL 2.0方法使用最简单的代码完成,但当然它不会使用光照/着色器为它们着色:
void Draw_Grid()
{
for(float i = -500; i <= 500; i += 5)
{
glBegin(GL_LINES);
glColor3ub(150, 190, 150);
glVertex3f(-500, 0, i);
glVertex3f(500, 0, i);
glVertex3f(i, 0,-500);
glVertex3f(i, 0, 500);
glEnd();
}
}
但是我可以找到除this以外的任何教程,我不太了解它可以很好地将图形转换为3D空间中的简单2D网格。
答案 0 :(得分:4)
是的,您可以只使用着色器生成几何体......
glDrawArrays()
gl_VertexID
或在几何着色器中使用gl_PrimitiveID
来程序生成您的内容。它可以更快,因为没有顶点属性或输入数据。更不用说节省的空间和初始化时间几乎没有。
以下是使用GL_TRIANGLES
绘制网格的顶点着色器的示例:
#version 150
uniform mat4 modelviewMat;
uniform mat3 normalMat;
uniform mat4 projectionMat;
uniform ivec2 dim;
out vec3 esNorm;
const vec2 triOffset[] = vec2[](
vec2(0,0),
vec2(0,1),
vec2(1,1),
vec2(0,0),
vec2(1,1),
vec2(1,0));
void main()
{
int triVert = gl_VertexID % 6;
int gridIndex = gl_VertexID / 6;
vec2 coord = vec2(gridIndex / dim.x, gridIndex % dim.x);
coord = (coord + triOffset[triVert]) / vec2(dim);
vec4 esVert = modelviewMat * vec4(coord * 2.0 - 1.0, 0.0, 1.0);
gl_Position = projectionMat * esVert;
esNorm = normalMat * vec3(0.0, 0.0, 1.0);
}
在我的古老ATI卡上没有使用VBO的情况下,我确实遇到了一些麻烦。这种方法适用于我的Nvidia显卡和新驱动程序。这里进一步讨论:Opengl, DrawArrays without binding VBO,其中建议glDrawArraysInstanced
/ gl_InstanceID
作为替代。
进一步说明。我注意到modulo %
算术在某些情况下会有点慢。使用更简单的按位操作或其他技巧可以加快速度。
答案 1 :(得分:-1)
GLSL不是为了做那样的事情。 GLSL用于编写着色器:
GLSL并非用于实际进行绘制调用。是的,您可以使用着色器生成过程几何体,但是您总是从几何体开始并在客户端绘制调用。