创建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++的类中.
网友评论