ZBLOG

GLSL着色器例子

以下是一个简单的 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6600

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?