gpt4 book ai didi

c++ - OpenGL - 让着色器编译时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:09 25 4
gpt4 key购买 nike

终于解决了我的shader无法使用编译失败的问题。

这是我的着色器加载例程。第一部分在着色器中读取:

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;
}

更新

看起来由于某种原因,内存中着色器的末尾添加了废话。我不确定为什么。我试过将它读入一个 char* 和一个字符串。这是输出:

<-!-> 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”。知道为什么吗?

另一个更新

最后的废话是由于最后多了一行。我删除了它,它又返回到输出正确的着色器文本。编译仍然没有运气。

我在这里不知所措。 Superbible 有大量未优化的库,我不需要。似乎没有适用于 Mac 的该死的像样的着色器编译器。我真的不介意它有多简单。它只需要与着色器一起工作。有没有人有例子?

最佳答案

您在调用 glShaderSource 时没有提供源数组中每个字符串的长度。因此,假定提供的字符串以空字节 ('\0') 结尾。您将文件读入内存的方式不会以额外的空字节终止着色器源。因此 GLSL 编译器将读取超出着色器源代码末尾的随机内存,并在那里找到……垃圾。

解决方案:添加终止空字节,或提供着色器文本长度参数。

关于c++ - OpenGL - 让着色器编译时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11606244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com