ZBLOG

Ubuntu 使用FreeGLUT 实现一个着色器的例子

下面是一个使用FreeGLUT和OpenGL在Ubuntu上实现简单着色器的例子。这个例子将创建一个窗口并绘制一个使用顶点着色器和片段着色器的简单三角形。

环境准备

首先,确保你已经安装了OpenGL、FreeGLUT和GLEW。在终端中运行以下命令来安装它们:

sudo apt update
sudo apt install freeglut3-dev libglew-dev mesa-utils

创建程序文件

  1. 创建一个新的C++源文件,例如shader_example.cpp
  2. 将以下代码复制到该文件中:
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>

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

const char* fragmentShaderSource = R"(
#version 330 core
out vec4 color;
void main() {
    color = vec4(1.0, 0.5, 0.2, 1.0); // 设置颜色为橙色
}
)";

// 编译着色器的函数
GLuint compileShader(GLenum type, const char* source) {
    GLuint shader = glCreateShader(type);
    glShaderSource(shader, 1, &source, nullptr);
    glCompileShader(shader);

    // 检查编译错误
    GLint success;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if (!success) {
        GLchar infoLog[512];
        glGetShaderInfoLog(shader, sizeof(infoLog), nullptr, infoLog);
        std::cerr << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    
    return shader;
}

// 初始化 OpenGL 和设置渲染环境
void init() {
    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);

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    // 定义三角形的顶点数据
    GLfloat vertices[] = {
         0.0f,  0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
     };

   GLuint VBO; // 顶点缓冲对象
   GLuint VAO; // 顶点数组对象

   // 创建VBO和VAO,并绑定数据
   glGenVertexArrays(1,&VAO);
   glGenBuffers(1,&VBO);

   glBindVertexArray(VAO); 
   glBindBuffer(GL_ARRAY_BUFFER,VBO); 
   
   // 将顶点数据复制到缓冲区中供OpenGL使用 
   glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GLL_STATIC_DRAW); 

   // 设置顶点属性指针 
   glVertexAttribPointer(0 ,3 ,GL_FLOAT , GL_FALSE ,3 * sizeof(GLfloat), (GLvoid*)nullptr); 
   glEnableVertexAttribArray(0); 

   //解绑 VAO 和 VBO 
   glBindBuffer(GL_ARRAY_BUFFER , 0 ); 
   glBindVertexArray( 0 ); 

}

void display() {
    static GLuint shaderProgram;

	// 清除屏幕并设置背景颜色
	glClearColor(1.f, 1.f ,1.f ,1.f );
	glClear(GL_COLOR_BUFFER_BIT);

	// 使用我们的着色器程序绘制三角形:
	glUseProgram(shaderProgram);  
	glBindVertexArray(VAO);  
	glDrawArrays(GL_TRIANGLES , 0 ,3 );  
	
	glutSwapBuffers(); 
}

// 主函数入口 
int main(int argc,char** argv ) { 

	glutInit(&argc ,argv );   
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);   
	glutInitWindowSize(800 ,600 );    
	glutCreateWindow("Simple Shader Example");   

	glewExperimental=true;  

	if (glewInit() != GLEW_OK ) {   
	    std::cerr << "Error initializing GLEW" << std::endl;  
	    return -1;  
	}   

	init();

	glutDisplayFunc(display);   
	glutMainLoop();   

	return 0; 
}

编译和运行

在终端中导航到保存该文件的目录,并使用以下命令编译它:

g++ shader_example.cpp -o shader_example -lGLEW -lglut -lGL

然后运行程序:

./shader_example

注意事项

  • 确保你的显卡驱动支持OpenGL。
  • 如果遇到任何问题,请检查GLEW是否正确初始化,以及是否有任何其他错误信息输出。

这是一个基本示例,展示了如何在Ubuntu上使用FreeGLUT和OpenGL编写和使用着色器。根据需要,你可以扩展这个示例,以增加更多功能或复杂性。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?