以下是一个简单的 GLSL 着色器示例,包括顶点着色器和片段着色器。这些着色器可以用于渲染一个简单的三角形。
顶点着色器 (Vertex Shader)
#version 330 core
layout(location = 0) in vec3 position; // 输入位置
layout(location = 1) in vec3 color; // 输入颜色
out vec3 fragColor; // 输出到片段着色器的颜色
void main() {
gl_Position = vec4(position, 1.0); // 设置裁剪坐标
fragColor = color; // 将颜色传递给片段着色器
}
片段着色器 (Fragment Shader)
#version 330 core
in vec3 fragColor; // 从顶点着色器接收颜色
out vec4 outColor; // 输出最终颜色到屏幕
void main() {
outColor = vec4(fragColor, 1.0); // 设置输出颜色,Alpha 值为不透明
}
如何使用这些着色器
OpenGL C++ 示例代码:
下面是一个简单的 OpenGL 程序示例,演示如何使用上述 GLSL 着色器来绘制一个三角形。
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
// 顶点数据:一个三角形
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 左下角(红)
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 右下角(绿)
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 顶部(蓝)
};
const char* vertexShaderSource = R"(
#version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
out vec3 fragColor;
void main() {
gl_Position = vec4(position, 1.0);
fragColor = color;
}
)";
const char* fragmentShaderSource = R"(
#version 330 core
in vec3 fragColor;
out vec4 outColor;
void main() {
outColor = vec4(fragColor, 1.0);
}
)";
// 编译着色器的函数
GLuint compileShader(GLenum type, const char* source) {
GLuint shaderID = glCreateShader(type);
glShaderSource(shaderID, 1, &source, nullptr);
glCompileShader(shaderID);
GLint success;
glGetShaderiv(shaderID, GL_COMPILE_STATUS, &success);
if (!success) {
char infoLog[512];
glGetShaderInfoLog(shaderID, sizeof(infoLog), nullptr , infoLog);
std::cerr << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n";
}
return shaderID;
}
int main() {
glfwInit();
GLFWwindow* window = glfwCreateWindow(800,600,"OpenGL Triangle", NULL,NULL);
glfwMakeContextCurrent(window);
glewExperimental=true;
glewInit();
GLuint VBO;
glGenBuffers(1,&VBO);
GLuint VAO;
glGenVertexArrays(1,&VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices , GL_STATIC_DRAW);
// position attribute
glVertexAttribPointer(0 ,3 ,GL_FLOAT , GL_FALSE ,6 * sizeof(float), (void*)nullptr );
glEnableVertexAttribArray(0 );
// color attribute
glVertexAttribPointer(1 ,3 ,GL_FLOAT , GL_FALSE ,6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1 );
GLuint vertexShader = compileShader(GL_VERTEX_SHADER , vertexShaderSource);
GLuint fragmentShader= compileShader(GL_FRAGMENT_SHADER , fragmentShaderSource);
GLuint shaderProgram=glCreateProgram();
glAttachShader(shaderProgram ,vertexShader );
glAttachShader(shaderProgram ,fragmentShader );
glLinkProgram(shaderProgram );
while (!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES , . ;
glfwSwapBuffers(window);
glfwPollEvents();
}
// 删除资源
glDeleteVertexArrays(1,&VAO );
glDeleteBuffers(1,&VBO );
return EXIT_SUCCESS ;
}
在此代码中,我们首先定义了顶点数据,其中包含每个顶点的位置和颜色。然后我们创建并编译了顶点和片段着色器,并将它们链接到一个程序中。最后,在主循环中绘制三角形。
请确保您已经设置好 OpenGL 环境,并安装了相应的库(如 GLEW 和 GLFW),以便运行这段代码。如果您有任何具体问题或需要进一步的帮助,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问