美文网首页
LearnOpenGL 创建Program和Shader

LearnOpenGL 创建Program和Shader

作者: li_礼光 | 来源:发表于2020-09-13 17:34 被阅读0次

创建Program流程
  • glCreateProgram
  • glAttachShader
  • glLikeProgram
  • glGetProgramiv
  • glDeleteProgram

创建Program

MyProgram .hpp

#ifndef MyProgram_hpp
#define MyProgram_hpp

#include <stdio.h>
#import <glad/glad.h>
#import <GLFW/glfw3.h>

class MyProgram {
    public:
        MyProgram(char * vertexShaderStr, char * fragmentShaderSrc);
        ~MyProgram();
    public:
        GLuint program = 0;
};
#endif /* MyProgram_hpp */
MyProgram .cpp

#include "MyProgram.hpp"
#include "MyShader.hpp"
#include <stdlib.h>
#include <stdio.h>

MyProgram::MyProgram(char* vertexShaderStr, char* fragmentShaderSrc)
{
    //创建Program
    program = glCreateProgram();

    //创建顶点着色器和片元着色器
    MyShader vertexShader(vertexShaderStr, MyGLShaderType::MyGL_SHADER_VERTEX);
    MyShader fragmentShader(fragmentShaderSrc, MyGLShaderType::MyGL_SHADER_FRAGMENT);

    //附着在Program上
    glAttachShader(program, vertexShader.shader);
    glAttachShader(program, fragmentShader.shader);
    
    //绑定
    glLinkProgram(program);
    
    //检查program
    GLint logLen = 0;
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLen);
    if (logLen > 0) {
        char* log = (char*)malloc(logLen);
        glGetProgramInfoLog(program, logLen, NULL, log);

        printf("Program Log:\n");
        printf("%s\n\n", log);

        free(log);
    }
};

MyProgram::~MyProgram()
{
    if (program != NULL) {
        //删除program
        glDeleteProgram(program);
        program = 0;
    }
};


Shader创建流程
  • glCreaterShader
  • glShaderSource
  • glCompileShader
  • glGetShaderiv
  • glDeleteShader

创建shader

MyShader.hpp

#ifndef MyShader_hpp
#define MyShader_hpp

#include <stdio.h>
#import <glad/glad.h>
#import <GLFW/glfw3.h>

enum MyGLShaderType
{
    MyGL_SHADER_VERTEX = 1,
    MyGL_SHADER_FRAGMENT = 2
};
class MyShader {
    public:
        MyShader(char * shaderStr, MyGLShaderType type);
        ~MyShader();
    public:
        GLuint shader = 0;
};

#endif /* MyShader_hpp */
MyShader.cpp

#include "MyShader.hpp"
#include <stdlib.h>
#include <stdio.h>

MyShader::MyShader(char* shaderStr, MyGLShaderType type)
{
    
    //创建Shader
    if (type == MyGLShaderType::MyGL_SHADER_VERTEX) {
        shader = glCreateShader(GL_VERTEX_SHADER);
    }
    else if(type == MyGLShaderType::MyGL_SHADER_FRAGMENT){
        shader = glCreateShader(GL_FRAGMENT_SHADER);
    }
    else {
        shader = glCreateShader(GL_VERTEX_SHADER);
    }
    
    //加载ShaderStr
    glShaderSource(shader, 1, &shaderStr, NULL);

    //编译Shader
    glCompileShader(shader);

    //检查Shader数据
    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);

    GLint logLen = 0;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLen);
    if (logLen > 0) {
        char* log = (char*)malloc(logLen);
        glGetShaderInfoLog(shader, logLen, NULL, log);
        printf("Shader Log:\n");
        printf("%s\n", log);
        free(log);
    }
};

MyShader::~MyShader()
{
    if (shader != 0) {
        //删除Shader
        glDeleteShader(shader);
        shader = 0;
    }
};

上面把创建Program和Shader分别放在两个C++的类中.


相关文章

网友评论

      本文标题:LearnOpenGL 创建Program和Shader

      本文链接:https://www.haomeiwen.com/subject/ldirektx.html