OpenGL:带着色器的 glColor3f() 和 glVertex3f()
OpenGL: glColor3f() and glVertex3f() with shader
我可以在着色器中使用 glColor3f()、glVertex3f() 或其他 API 函数吗?我写了一个着色器来绘制一个彩色立方体,它工作正常。
我的顶点着色器和片段着色器看起来像这样
#vertext shader
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
out vec4 vertexColor;
void main()
{
gl_Position = proj * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor = vec4(aColor, 1.0);
};
#fragment shader
#version 330 core
in vec4 vertexColor;
out vec4 FragColor;
void main(){
FragColor = vertexColor;
};
不,我尝试将 gl 函数与我的彩色立方体一起使用。假设我有一些这样的绘制代码。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, -1, 0, 0, 0, 0, 1, 0);
glColor3f(1.0, 0.0, 0.0);
glLineWidth(3);
glBegin(GL_LINES);
glVertex3f(-1, -1, 0);
glVertex3f(1, 1, 0);
因为我使用了 glUseProgram() 来使用我自己的着色器。上面的 gl 函数似乎没有按预期工作(坐标和颜色都是错误的)。 glVertex3f() 之类的函数如何将顶点传递给着色器?以及使用gl函数绘制时着色器应该是什么样子?
glBegin()
/glEnd()
指令用于 OpenGL 的兼容性配置文件,而不是更现代的核心配置文件。但是,您正在使用 #version 330 core
.
行在核心配置文件中编译着色器
即使着色器没有编译到核心配置文件中,我也不认为它们会起作用,因为我相信你不能传递带有位置索引的顶点属性(aPos
,aColor
) 使用 glVertex3f
.
我建议使用核心 Opengl 进行渲染调用。这意味着你不应该使用 glBegin()
...glEnd()
并在每个渲染周期中传递顶点坐标。相反,立方体预先坐标到 GPU 并让您的着色器访问这些值:
- 使用
glGenBuffers()
创建 VertexBuffer 对象。
- 使用
glBufferData()
. 将顶点数据存储在缓冲区中
- 从缓冲区中提取
aPos
和 aColor
属性,并使用 glVertexAttribPointer()
. 分别为它们分配索引 0 和 1
这应该可行,无需更改着色器代码。
编辑:
为了在兼容性配置文件中呈现,glBegin
/glEnd
中提供的数据是通过默认着色器管道 运行。您不能使用显式着色器代码自定义管线(就像您现在所做的那样),但您可以修改管线中的一些基本内容(例如颜色、phong 照明、纹理)。所以如果你想得到你的着色器代码所代表的结果,你需要做这样的事情:
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-1.0f,-0.25f,0.0f); //First vertex
glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f,-0.25f,0.0f); // Second vertex
...
glEnd();
这种在渲染调用期间发送完整对象详细信息的方式称为立即模式。要添加光照,您需要 glEnable(GL_LIGHTING)
、为每个顶点添加法线信息和一堆其他内容。
如果您使用核心配置文件,您可以定义自己的着色器,但您不能在渲染调用期间使用立即模式。您需要在渲染循环之前传递顶点数据。基本上 glBegin
、glEnd
、'glVertex3f' 在核心配置文件中不受支持,您需要使用上面的 3 点在渲染任何内容之前将数据存储在图形设备中(使用glDrawArrays()
)。 This 教程很好地介绍了这些概念,可以帮助您使用核心配置文件绘制所需的立方体。
Can I use glColor3f(), glVertex3f() or other API functions with shader?
是的,你可以。
但是,您需要使用兼容性配置文件 OpenGL Context and you are limited to a GLSL 1.20 vertex shader and the Vertex Shader Built-In Attributes (e.g. gl_Vertex
, gl_Color
). You can combine a GLSL 1.20 vertex shader with your fragment shader. The matrices in the fixed function matrix stack can be accessed with Built-In Uniforms,例如 gl_ModelViewProjectionMatrix
。
OpenGL Shading Language 1.20 Specification.
中详细说明了所有属性和制服
一个合适的顶点着色器看起来像这样:
#version 120
varying vec4 vertexColor;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vertexColor = gl_Color;
};
#version 330
in vec4 vertexColor;
out vec4 FragColor;
void main(){
FragColor = vertexColor;
};
我可以在着色器中使用 glColor3f()、glVertex3f() 或其他 API 函数吗?我写了一个着色器来绘制一个彩色立方体,它工作正常。 我的顶点着色器和片段着色器看起来像这样
#vertext shader
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
out vec4 vertexColor;
void main()
{
gl_Position = proj * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertexColor = vec4(aColor, 1.0);
};
#fragment shader
#version 330 core
in vec4 vertexColor;
out vec4 FragColor;
void main(){
FragColor = vertexColor;
};
不,我尝试将 gl 函数与我的彩色立方体一起使用。假设我有一些这样的绘制代码。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, -1, 0, 0, 0, 0, 1, 0);
glColor3f(1.0, 0.0, 0.0);
glLineWidth(3);
glBegin(GL_LINES);
glVertex3f(-1, -1, 0);
glVertex3f(1, 1, 0);
因为我使用了 glUseProgram() 来使用我自己的着色器。上面的 gl 函数似乎没有按预期工作(坐标和颜色都是错误的)。 glVertex3f() 之类的函数如何将顶点传递给着色器?以及使用gl函数绘制时着色器应该是什么样子?
glBegin()
/glEnd()
指令用于 OpenGL 的兼容性配置文件,而不是更现代的核心配置文件。但是,您正在使用 #version 330 core
.
即使着色器没有编译到核心配置文件中,我也不认为它们会起作用,因为我相信你不能传递带有位置索引的顶点属性(aPos
,aColor
) 使用 glVertex3f
.
我建议使用核心 Opengl 进行渲染调用。这意味着你不应该使用 glBegin()
...glEnd()
并在每个渲染周期中传递顶点坐标。相反,立方体预先坐标到 GPU 并让您的着色器访问这些值:
- 使用
glGenBuffers()
创建 VertexBuffer 对象。 - 使用
glBufferData()
. 将顶点数据存储在缓冲区中
- 从缓冲区中提取
aPos
和aColor
属性,并使用glVertexAttribPointer()
. 分别为它们分配索引 0 和 1
这应该可行,无需更改着色器代码。
编辑:
为了在兼容性配置文件中呈现,glBegin
/glEnd
中提供的数据是通过默认着色器管道 运行。您不能使用显式着色器代码自定义管线(就像您现在所做的那样),但您可以修改管线中的一些基本内容(例如颜色、phong 照明、纹理)。所以如果你想得到你的着色器代码所代表的结果,你需要做这样的事情:
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-1.0f,-0.25f,0.0f); //First vertex
glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f,-0.25f,0.0f); // Second vertex
...
glEnd();
这种在渲染调用期间发送完整对象详细信息的方式称为立即模式。要添加光照,您需要 glEnable(GL_LIGHTING)
、为每个顶点添加法线信息和一堆其他内容。
如果您使用核心配置文件,您可以定义自己的着色器,但您不能在渲染调用期间使用立即模式。您需要在渲染循环之前传递顶点数据。基本上 glBegin
、glEnd
、'glVertex3f' 在核心配置文件中不受支持,您需要使用上面的 3 点在渲染任何内容之前将数据存储在图形设备中(使用glDrawArrays()
)。 This 教程很好地介绍了这些概念,可以帮助您使用核心配置文件绘制所需的立方体。
Can I use glColor3f(), glVertex3f() or other API functions with shader?
是的,你可以。
但是,您需要使用兼容性配置文件 OpenGL Context and you are limited to a GLSL 1.20 vertex shader and the Vertex Shader Built-In Attributes (e.g. gl_Vertex
, gl_Color
). You can combine a GLSL 1.20 vertex shader with your fragment shader. The matrices in the fixed function matrix stack can be accessed with Built-In Uniforms,例如 gl_ModelViewProjectionMatrix
。
OpenGL Shading Language 1.20 Specification.
一个合适的顶点着色器看起来像这样:
#version 120
varying vec4 vertexColor;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vertexColor = gl_Color;
};
#version 330
in vec4 vertexColor;
out vec4 FragColor;
void main(){
FragColor = vertexColor;
};