夏天/isummer

Sun of my life !Talk is cheap, Show me the code! 追风赶月莫停留,平芜尽处是春山~

博客园 首页 新随笔 联系 管理

 

GLSLwiki   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 while
    glUseProgram(shaderProgram); // 设置要使用的着色器程序
    // Draw Something  
}   

//渲染程序结束,要 释放着色器程序
glDeleteProgram(shaderProgram); 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

endl;

 

posted on 2025-12-30 09:09  夏天/isummer  阅读(1)  评论(0)    收藏  举报