ZBLOG

Linux 使用OpenGL 实现一个着色器的例子

在Linux上使用OpenGL实现一个简单的着色器例子,可以按照以下步骤进行。这个例子将演示如何创建一个窗口,加载顶点和片段着色器,并渲染一个简单的三角形。

环境准备

  1. 安装必要的库: 在终端中运行以下命令来安装OpenGL相关的库:

    sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev
    
  2. 创建项目文件结构: 创建一个新的文件夹来存放你的代码,例如opengl_shader_example,并进入该目录:

    mkdir opengl_shader_example
    cd opengl_shader_example
    
  3. 创建源代码文件: 创建一个名为main.cpp的C++源文件。

示例代码

#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>

// 着色器程序ID
GLuint shaderProgram;

// 顶点着色器源码
const char* vertexShaderSource = R"(
#version 330 core
layout(location = 0) in vec3 aPos;
void main() {
    gl_Position = vec4(aPos, 1.0);
}
)";

// 片段着色器源码
const char* fragmentShaderSource = R"(
#version 330 core
out vec4 fragColor;
void main() {
    fragColor = vec4(0.0, 1.0, 0.0, 1.0); // 渲染绿色
}
)";

// 初始化并编译着色器函数
void initShaders() {
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);

    GLint success;
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cerr << "Vertex Shader Compilation Error: " << infoLog << std::endl;
    }

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cerr << "Fragment Shader Compilation Error: " << infoLog << std::endl;
    }

    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);

    // 删除着色器,因为它们已经被链接到程序中,不再需要了
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}

// OpenGL初始化设置函数
void initOpenGL() {
    glewInit();
    
    // 设置背景颜色为黑色
    glClearColor(0.2f, 0.2f, 0.2f, 1.0f);

    initShaders();

}

// 渲染函数 
void display() {
     // 清除屏幕与深度缓冲区 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
     
     // 使用编译好的着色器程序 
     glUseProgram(shaderProgram);  

     // 定义三角形的顶点坐标 
     float vertices[] = { 
         -0.5f, -0.5f, 0.0f,
          0.5f,-0.5f , 0.0f,
          0.0f ,  0.5f , 0.0f  
     }; 

     GLuint VAO; // Vertex Array Object ID 
     GLuint VBO; // Vertex Buffer Object ID 

     // 创建和绑定VAO和VBO 
     glGenVertexArrays(1,&VAO);  
     glGenBuffers(1,&VBO);  
      
     // bind the Vertex Array Object first,然后绑定并设置顶点缓冲对象(VBOs)
     	glBindVertexArray(VAO);  

     	// 把顶点数据复制给我们的顶点缓冲对象(VBO)
     	glBindBuffer(GL_ARRAY_BUFFER,VBO);  
     	glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices ,GL_STATIC_DRAW );  

     	// 设置顶点属性指针,以告诉OpenGL我们要传递什么数据到shader中 
     	glVertexAttribPointer( 
         		// layout(location=?) from vertex shader    
             		// 向量大小是3(x,y,z) 
             		// 数据类型是float           
             		GL_FLOAT ,   
             		sizeof(float)*3 ,    
             		GL_FALSE ,         
             		sizeof(float)*3 ,     
             		(void*)nullptr        
     	    ); 

     	glEnableVertexAttribArray(0);   

     	glBindBuffer(GL_ARRAY_BUFFER,VBO );   
	 	glBindVertexArray(VAO);     
	 	
	 	// 绘制三角形及其VAO内容   
	 	glDrawArrays(GL_TRIANGLES ,/*开始绘制*/ /*开始索引值为 */ /*绘制数量*/ );     

	 	glutSwapBuffers();  
}  

int main(int argc,char** argv) {  
	glutInit(&argc ,argv );   
	glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );  
	glutInitWindowSize (800 ,600 );   
	glutCreateWindow ("OpenGL Shader Example");    

	initOpenGL();   

	glutDisplayFunc(display);    
	glutMainLoop();    
	return EXIT_SUCCESS ;   
}

编译与运行

在终端中导航到项目目录,并使用g++编译代码:

g++ main.cpp -o opengl_shader_example -lGLEW -lGLU -lglut -lGL

然后运行生成的可执行文件:

./opengl_shader_example

你应该会看到一个窗口,其中渲染了一个绿色的三角形。

注意事项

  • 确保你的系统支持OpenGL,并已正确安装所需库。
  • 此示例使用了基本的错误检查。可以根据需要增强它以处理更多情况。
  • 如果需要不同版本或配置,请确保相应地调整上下文创建和版本声明。

这就是在Linux上使用OpenGL实现简单着色器的基本步骤!


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?