Browse Source

为shader编译和链接添加错误检查

master
blobt 4 years ago
parent
commit
5183dccab4
  1. BIN
      .vs/shader2/v14/.suo
  2. 68
      main.cpp
  3. 73
      misc.cpp
  4. 2
      misc.h
  5. 2
      model.cpp
  6. BIN
      shader2.VC.db

BIN
.vs/shader2/v14/.suo

68
main.cpp

@ -22,75 +22,7 @@ LRESULT CALLBACK GLWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return DefWindowProc(hwnd, msg, wParam, lParam);//其他消息调用window默认处理函数 return DefWindowProc(hwnd, msg, wParam, lParam);//其他消息调用window默认处理函数
} }
/**
* GPU程序
*/
GLuint CreateGPUProgram(const char* vsShaderPath, const char* fsShaderPath) {
//创建shader
GLuint vsShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fsShader = glCreateShader(GL_FRAGMENT_SHADER);
//读取shader代码
const char* vsCode = LoadFileContent(vsShaderPath);
const char* fsCode = LoadFileContent(fsShaderPath);
//把shader代码 从内存传到显存
glShaderSource(vsShader, 1, &vsCode, nullptr);
glShaderSource(fsShader, 1, &fsCode, nullptr);
//编译shader
glCompileShader(vsShader);
GLint compileResult = GL_TRUE;
glGetShaderiv(vsShader, GL_COMPILE_STATUS, &compileResult);
if (compileResult == GL_FALSE) {
char szLog[1024] = { 0 };
GLsizei logLen = 0;//实际错误日志长度
glGetShaderInfoLog(vsShader, 1024, &logLen, szLog);
printf("Compile shader fail error log is : %s \n shader code :\n %s \n ", szLog, vsCode);
glDeleteShader(vsShader);
}
glCompileShader(fsShader);
compileResult = GL_TRUE;
glGetShaderiv(fsShader, GL_COMPILE_STATUS, &compileResult);
if (compileResult == GL_FALSE) {
char szLog[1024] = { 0 };
GLsizei logLen = 0;//实际错误日志长度
glGetShaderInfoLog(fsShader, 1024, &logLen, szLog);
printf("Compile shader fail error log is : %s \n shader code :\n %s \n ", szLog, fsCode);
glDeleteShader(fsShader);
}
//创建program
GLuint program = glCreateProgram();
//绑定shader
glAttachShader(program, vsShader);
glAttachShader(program, fsShader);
//连接
glLinkProgram(program);
GLint nResult;
glGetProgramiv(program, GL_LINK_STATUS, &nResult);
if (nResult == GL_FALSE) {
char log[1024] = { 0 };
GLsizei writed = 0;
glGetProgramInfoLog(program, 1024, &writed, log);
printf("Create CPU program fail error %s\n", log);
glDeleteProgram(program);
program = 0;
}
//解绑shader
glDetachShader(program, vsShader);
glDetachShader(program, fsShader);
//删除shader
glDeleteShader(vsShader);
glDeleteShader(fsShader);
return program;
}
/** /**
* @hinstance * @hinstance
* @hPrevInstance * @hPrevInstance

73
misc.cpp

@ -36,3 +36,76 @@ char* LoadFileContent(const char *path) {
fclose(pFile); fclose(pFile);
return nullptr; return nullptr;
} }
GLuint CompileShader(GLenum shaderType, const char * shaderPath)
{
//创建shader
GLuint shader = glCreateShader(shaderType);
if (shader == 0) {
printf("glCreateShader false\n");
return 0;
}
//读取shader代码
const char* shaderCode = LoadFileContent(shaderPath);
if (shaderCode == nullptr) {
printf("load shader code from file: %s false\n", shaderPath);
return 0;
}
//把shader代码 从内存传到显存
glShaderSource(shader, 1, &shaderCode, nullptr);
glCompileShader(shader);
GLint compileResult = GL_TRUE;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
if (compileResult == GL_FALSE) {
char szLog[1024] = { 0 };
GLsizei logLen = 0;//实际错误日志长度
glGetShaderInfoLog(shader, 1024, &logLen, szLog);
printf("Compile shader fail error log is : %s \n shader code :\n %s \n ", szLog, shaderCode);
glDeleteShader(shader);
return 0;
}
return shader;
}
/**
* GPU程序
*/
GLuint CreateGPUProgram(const char* vsShaderPath, const char* fsShaderPath) {
GLuint vsShader = CompileShader(GL_VERTEX_SHADER,vsShaderPath);
GLuint fsShader = CompileShader(GL_FRAGMENT_SHADER,fsShaderPath);
//创建program
GLuint program = glCreateProgram();
//绑定shader
glAttachShader(program, vsShader);
glAttachShader(program, fsShader);
//连接
glLinkProgram(program);
//解绑shader
glDetachShader(program, vsShader);
glDetachShader(program, fsShader);
//删除shader
glDeleteShader(vsShader);
glDeleteShader(fsShader);
//检查错误
GLint nResult;
glGetProgramiv(program, GL_LINK_STATUS, &nResult);
if (nResult == GL_FALSE) {
char log[1024] = { 0 };
GLsizei writed = 0;
glGetProgramInfoLog(program, 1024, &writed, log);
printf("Create CPU program fail error %s\n", log);
glDeleteProgram(program);
program = 0;
}
return program;
}

2
misc.h

@ -3,3 +3,5 @@
GLuint CreateBufferObject(GLenum bufferType, GLsizeiptr size, GLenum usage, void* data = nullptr); GLuint CreateBufferObject(GLenum bufferType, GLsizeiptr size, GLenum usage, void* data = nullptr);
char* LoadFileContent(const char *path); char* LoadFileContent(const char *path);
GLuint CompileShader(GLenum shaderType, const char* shaderPath);
GLuint CreateGPUProgram(const char* vsShaderPath, const char* fsShaderPath);

2
model.cpp

@ -33,7 +33,7 @@ VertexData * LoadObjModel(const char * filePath, unsigned int ** indexes, int &
while (!ssObjFile.eof()) { while (!ssObjFile.eof()) {
memset(szOneLine, 0, 256); memset(szOneLine, 0, 256);
ssObjFile.getline(szOneLine, 256); ssObjFile.getline(szOneLine, 256);
printf("%s \n", szOneLine);
//printf("%s \n", szOneLine);
if (strlen(szOneLine) > 0) { if (strlen(szOneLine) > 0) {
std::stringstream ssOneLine(szOneLine); std::stringstream ssOneLine(szOneLine);
if (szOneLine[0] == 'v') { if (szOneLine[0] == 'v') {

BIN
shader2.VC.db

Loading…
Cancel
Save