最终解决了我的着色器无法适应编译失败的问题。
这是我的着色器加载例程。第一部分在着色器中读取:
void GLSLShader::LoadFromFile(GLenum whichShader, const string filename)
{
ifstream fp;
// Attempt to open the shader
fp.open(filename.c_str(), ios_base::in);
// If the file exists, load it
if(fp)
{
// Copy the shader into the buffer
string buffer(std::istreambuf_iterator<char>(fp), (std::istreambuf_iterator<char>()));
// Debug output to show full text of shader
errorLog.writeSuccess("Shader debug: %s", buffer.c_str());
LoadFromString(whichShader, buffer);
}
else
{
errorLog.writeError("Could not load the shader %s", filename.c_str());
}
}
在它将其加载到字符串中后,它将其发送到要加载的:
void GLSLShader::LoadFromString(GLenum type, const string source)
{
// Create the shader
GLuint shader = glCreateShader(type);
// Convert the string
const char * ptmp = source.c_str();
glShaderSource(shader, 1, &ptmp, NULL);
// Compile the shader
glCompileShader(shader);
// Check to see if the shader has loaded
GLint status;
glGetShaderiv (shader, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) {
GLint infoLogLength;
glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar *infoLog= new GLchar[infoLogLength];
glGetShaderInfoLog (shader, infoLogLength, NULL, infoLog);
errorLog.writeError("could not compile: %s", infoLog);
delete [] infoLog;
}
_shaders[_totalShaders++]=shader;
}
我得到的调试输出"无法编译:"并且错误缓冲区似乎是空的。在过去的三天里,这让我抓狂。有人看到我的错误了吗?
以下是非常简单的着色器:
#version 330
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
smooth out vec4 theColor;
void main()
{
gl_Position = position;
theColor = color;
}
#version 330
smooth in vec4 theColor;
out vec4 outputColor;
void main()
{
outputColor = theColor;
}
更新
由于某种原因,内存中的着色器末尾似乎添加了垃圾。我不知道为什么。我试着把它读成一个字符*和一个字符串。这是输出:
<-!-> Shader: #version 330
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
smooth out vec4 theColor;
void main()
{
gl_Position = position;
theColor = color;
}
n
<-!-> Shader: #version 330
smooth in vec4 theColor;
out vec4 outputColor;
void main()
{
outputColor = theColor;
}
nts/Resources
请注意第一个着色器结尾的"n"和第二个着色器末尾的"nts/Resources"。知道为什么吗?
另一个更新
结尾处的垃圾是由于结尾处多了一行字造成的。我删除了它,它又回到了输出正确的着色器文本。编译方面仍然没有运气。
我在这里不知所措。《超级圣经》有大量未经优化的图书馆,我不需要。Mac似乎没有一个像样的着色器编译器。我真的不介意它有多简单。它只需要使用着色器。有人举个例子吗?
您调用glShaderSource
时没有提供源数组中每个字符串的长度。因此,假定提供的字符串以空字节("\0")终止。将文件读取到内存中的方式不会使用额外的null字节终止着色器源。因此,GLSL编译器将从着色器源的末尾读取到随机内存中,在那里它会发现…垃圾。
解决方案:添加终止的空字节,或提供着色器文本长度参数。