日照市网站建设_网站建设公司_测试上线_seo优化
2025/12/30 9:14:10 网站建设 项目流程

 

GLSL(wiki   chs)是OpenGL(OpenGL ES、WebGL)的着色器语言,拥有如下特点:

  与C语言一样,包括:预处理 -- 编译 -- 链接 -- 执行   四大步骤 

使用流程如下:

1. 提供顶点着色器(.vs)和片元着(.fs)文件。

2. 在CPU端,顶点着色器和片元着色器文件上载GPU,并在GPU端进行编译

3. 在GPU端,创建着色器程序,并完成链接。

 4. 在CPU端,使用着色器程序

image

程序如下:

(1)以下是顶点着色器和片段着色器的文本内容。

const char *vertexShaderSource = "#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main()\n""{\n""   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n""}\0";
const char *fragmentShaderSource = "#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\n\0";

(2)在GPU端创建着色器,完成文本上载到GPU端,进行链接,编译。

GPU编译:顶点着色器

// build and compile our shader program
// ------------------------------------
// vertex shader
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);//在GPU端创建着色器
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);//GPU编译顶点着色器
// check for shader compile errors
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); // 检查是否vs编译成功
if (!success)
{glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); // 获取编译错误消息std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}

GPU编译:片段着色器

// fragment shader
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);//GPU端编译着色器
// check for shader compile errors
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); // 检查是否fs编译成功
if (!success)
{glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); // 获取编译错误消息std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}

GPU端创着色器程序,并链接着色器

// link shaders
unsigned int shaderProgram = glCreateProgram();//GPU端创建:着色器程序
glAttachShader(shaderProgram, vertexShader);// 附加GPU端已经编译好的:顶点着色器
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);// 执行着色器程序的链接过程// check for linking errors
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); // 检测链接着色器程序是否失败
if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); // 获取链接错误消息std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}glDeleteShader(vertexShader); // 链接完成后,不在需要vs着色器对象,在GPU端释放:已经编译好的顶点着色器(vertexShader,就是GPU端的地址)
glDeleteShader(fragmentShader); // 链接完成后,不在需要fs着色器对象

 CPU端使用着色器程序,程序结束,则释放GPU端的着色器程序

// render loop
// -----------
while (1)
{// Sleep for a whileglUseProgram(shaderProgram); // 设置要使用的着色器程序// Draw Something  
}   //渲染程序结束,要 释放着色器程序
glDeleteProgram(shaderProgram); 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

endl;

 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询