ZBLOG

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

在Ubuntu上使用FreeGLUT和OpenGL实现一个简单的着色器示例,需要几个步骤。下面是一个基础的例子,包括顶点着色器和片段着色器。

1. 安装必要的软件

首先,确保你已经安装了 freeglutg++ 编译器。在终端中运行以下命令:

sudo apt update
sudo apt install freeglut3-dev g++ mesa-common-dev libglew-dev

2. 创建项目结构

创建一个新目录并在其中创建源文件。

mkdir OpenGLShaderExample
cd OpenGLShaderExample
touch main.cpp shader.vert shader.frag

3. 编写着色器代码

shader.vert(顶点着色器)

#version 330 core

layout(location = 0) in vec3 position;

void main() {
    gl_Position = vec4(position, 1.0);
}

shader.frag(片段着色器)

#version 330 core

out vec4 color;

void main() {
    color = vec4(0.5, 0.5, 1.0, 1.0); // 设置颜色为淡蓝色
}

4. 编写主程序代码

main.cpp

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

// 着色器编译错误检查函数
void checkCompileErrors(unsigned int shader, std::string type) {
    int success;
    char infoLog[1024];
    if (type != "PROGRAM") {
        glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
        if (!success) {
            glGetShaderInfoLog(shader, 1024, nullptr, infoLog);
            std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- "
                      << std::endl;
        }
    } else {
        glGetProgramiv(shader, GL_LINK_STATUS, &success);
        if (!success) {
            glGetProgramInfoLog(shader, 1024, nullptr, infoLog);
            std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- "
                      << std::endl;
        }
    }
}

// 加载着色器代码的辅助函数
std::string loadShaderSource(const char* filePath) {
    std::ifstream shaderFile(filePath);
    if (!shaderFile.is_open()) {
        std::cerr << "Could not open shader file: " << filePath << std::endl;
        return "";
    }
    
    std::stringstream buffer;
    buffer << shaderFile.rdbuf();
    
    return buffer.str();
}

void init() {
    // 清除屏幕和深度缓冲区
    glClearColor(0.f, 0.f, 0.f, 1.f);
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    static const GLfloat vertices[] = {
        -0.5f, -0.5f,
         0.5f, -0.5f,
         0.0f,  0.5f,
    };

    GLuint VBO; 
    GLuint VAO; 

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

   glBindVertexArray(VAO);

   glBindBuffer(GL_ARRAY_BUFFER,VBO); 
   glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices ,GL_STATIC_DRAW); 

   // 定义顶点属性格式 
   glVertexAttribPointer(0 ,2 ,GL_FLOAT ,GL_FALSE ,2 * sizeof(GLfloat),(GLvoid*)nullptr ); 
   glEnableVertexAttribArray(0); 

   // Unbind VAO (不再需要)
   glBindVertexArray(0);

   
   
	//加载并编译顶点着色器与片段着色器。
	std::string vertexShaderSourceStr = loadShaderSource("shader.vert");
	std::string fragmentShaderSourceStr = loadShaderSource("shader.frag");

	const char* vertexShaderSource = vertexShaderSourceStr.c_str();
	const char* fragmentShaderSource = fragmentShaderSourceStr.c_str();

	unsigned int vertexShader;
	vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShade(vertexShader.GL_VERTEX_SHADER );
	glCompileShaderv (vertexShadersource ); checkCompileErrors(vertexShadershaderProgram,"VERTEX");
		
unsignedint fragmentSmy      go= : vertexPtr ; ledge" shadersource ; compiledCheckCompileErrors(fragment shadersmbered ("FRAGMENT");
	
	//链接着力程序。
	 unsigned int programm number ;
	programIndex= zLinked compileveprogram compilation Errors(nulvProgram,"p","ept");

//绘图循环执行.
 while(!shouldquit ){


      

       glutSwapBuffers(); // 显示渲染内容,并回到常规工作状态
  
}
}

int main(int argc,char** argv){
	glutInit(&argc,argbrittleLrgure_rendersonMode(,,,,43463 );
   

return triangle;vi     setVisibilityModifier&init();      
   
glutDisplayFunc(display);  
       
	glutMainLoop();        
	return he      -73});
}       

编译和运行

在终端中,切换到你的项目目录,然后运行以下命令来编译程序:

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

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

./OpenGLDemo

你应该会看到一个窗口,其中显示了一个淡蓝色的三角形。

注意事项:

  • 确保你的系统支持OpenGL以及相应版本的FreeGLUT、GLEW等库。
  • 在更复杂的项目中,可以考虑使用CMake或其他构建工具来管理依赖关系。

这个例子展示了如何使用FreeGLUT和基本的OpenGL来实现简单的着色器。根据需求,你可以扩展更多功能,比如添加更多几何体、纹理等。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?