我正在尝试重写我正在使用的着色器加载器,当我尝试编译程序时,我不断收到标题错误。我对相关问题的搜索出现了these two个主题,这些主题表明问题可能与我使用字符串有关,所以我尝试将加载的着色器从字符串对象复制到数组,并且它仍然在发生。这是我的Initialize函数的相关部分:
// Begin shader loading
vertShader = glCreateShader(GL_VERTEX_SHADER);
fragShader = glCreateShader(GL_FRAGMENT_SHADER);
// Vertex shader first
vertShaderCode = loader.read("vs.txt");
char codeHolder[vertShaderCode.size() + 1];
std::size_t length = vertShaderCode.copy(codeHolder, vertShaderCode.size(), 0);
codeHolder[length] = '\0';
const char* tmp1 = codeHolder;
// Compile the vertex shader
glShaderSource(vertShader, 1, &tmp1, NULL);
glCompileShader(vertShader);
这比可能需要的更冗长,但我试图非常明确,所以我没有错过任何东西。
我知道我的着色器加载器类工作正常,因为在我正在检查编译状态并打印出错误消息的部分中,我添加了一些代码来检查以确保所有内容都正确传递:
//check the compile status
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &shader_status);
if (!shader_status)
{
ofstream fout;
fout.open("verification.txt");
fout << vertShaderCode << endl;
int index = 0;
while(tmp1[index] != '\0' && index < 1000)
{
fout << tmp1[index];
index++;
}
fout << endl;
index = 0;
while(codeHolder[index] != '\0' && index < 1000)
{
fout << codeHolder[index];
index++;
}
fout.close();
GLchar InfoLog[1024];
glGetShaderInfoLog(vertShader, sizeof(InfoLog), NULL, InfoLog);
fprintf(stderr, "Vertex Shader %d: '%s'\n", vertShader, InfoLog);
return false;
}
“verify.txt”文件以我期望的三个着色器代码副本结束:
attributevec3v_position;attributevec3v_color;varyingvec3color;uniformmat4mvpMatrix;voidmain(){gl_Position=mvpMatrix*vec4(v_position,1.0);color=v_color;}
attributevec3v_position;attributevec3v_color;varyingvec3color;uniformmat4mvpMatrix;voidmain(){gl_Position=mvpMatrix*vec4(v_position,1.0);color=v_color;}
attributevec3v_position;attributevec3v_color;varyingvec3color;uniformmat4mvpMatrix;voidmain(){gl_Position=mvpMatrix*vec4(v_position,1.0);color=v_color;}
我知道我的程序的其余部分也可以正常工作,因为如果我只是将着色器硬编码到我的应用程序中,它就能很好地工作。
先谢谢,这太烦人了。
编辑:这是我的makefile
# Linux
CC=g++
LIBS= -lglut -lGLEW -lGL
# Compiler flags
CXXFLAGS= -g -Wall -std=c++0x
all: ../bin/Matrix
../bin/Matrix: ../src/main.cpp
$(CC) $(CXXFLAGS) ../src/main.cpp -o ../bin/Matrix $(LIBS)