glfw的顶点着色器和片段着色器怎么创建
时间: 2023-10-16 15:12:21 浏览: 151
opengl入门 绘制三角形+片段着色器
首先,你需要创建一个顶点着色器和一个片段着色器的文件。这些文件通常使用GLSL语言编写。
下面是一个简单的顶点着色器的例子:
```
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
```
这个着色器接受一个顶点坐标,将其作为输入变量 aPos,并将其转换为标准化设备坐标(NDC)中的位置。然后,它将位置赋值给内置输出变量 gl_Position。
下面是一个简单的片段着色器的例子:
```
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
```
这个着色器只是简单地将输出颜色设置为橙色。
接下来,你需要在代码中加载这些着色器文件并编译它们。以下是一个使用GLFW和GLEW库的简单示例:
```c++
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
int main()
{
// 初始化 GLFW
glfwInit();
// 创建窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "My Title", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 初始化 GLEW
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
// 编译顶点着色器
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// 检查顶点着色器编译是否成功
GLint success;
GLchar infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "Failed to compile vertex shader\n" << infoLog << std::endl;
return -1;
}
// 编译片段着色器
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// 检查片段着色器编译是否成功
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout << "Failed to compile fragment shader\n" << infoLog << std::endl;
return -1;
}
// 创建着色器程序
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 检查着色器程序链接是否成功
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "Failed to link shader program\n" << infoLog << std::endl;
return -1;
}
// 删除着色器对象
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// 渲染循环
while (!glfwWindowShouldClose(window))
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 使用着色器程序
glUseProgram(shaderProgram);
// 绘制三角形
glBegin(GL_TRIANGLES);
glVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
glEnd();
// 交换缓冲区并检查是否有触发事件
glfwSwapBuffers(window);
glfwPollEvents();
}
// 删除着色器程序
glDeleteProgram(shaderProgram);
// 终止 GLFW
glfwTerminate();
return 0;
}
```
在这个示例中,我们首先定义了顶点着色器和片段着色器的源代码字符串。然后,我们编译这些着色器并链接它们成一个着色器程序。最后,我们在渲染循环中使用这个着色器程序。
注意,着色器程序在使用后需要删除,以释放内存。
阅读全文