我的编码着色器的代码有点问题,即它们都注册为失败的编译并且没有收到日志。
这是着色器编译代码:
/* Make the shader */
Uint size;
GLchar* file;
loadFileRaw(filePath, file, &size);
const char * pFile = file;
const GLint pSize = size;
newCashe.shader = glCreateShader(shaderType);
glShaderSource(newCashe.shader, 1, &pFile, &pSize);
glCompileShader(newCashe.shader);
GLint shaderCompiled;
glGetShaderiv(newCashe.shader, GL_COMPILE_STATUS, &shaderCompiled);
if(shaderCompiled == GL_FALSE)
{
ReportFiler->makeReport("ShaderCasher.cpp", "loadShader()", "Shader did not compile", "The shader " + filePath + " failed to compile, reporting the error - " + OpenGLServices::getShaderLog(newCashe.shader));
}
这些是支持功能:
bool loadFileRaw(string fileName, char* data, Uint* size)
{
if (fileName != "")
{
FILE *file = fopen(fileName.c_str(), "rt");
if (file != NULL)
{
fseek(file, 0, SEEK_END);
*size = ftell(file);
rewind(file);
if (*size > 0)
{
data = (char*)malloc(sizeof(char) * (*size + 1));
*size = fread(data, sizeof(char), *size, file);
data[*size] = '\0';
}
fclose(file);
}
}
return data;
}
string OpenGLServices::getShaderLog(GLuint obj)
{
int infologLength = 0;
int charsWritten = 0;
char *infoLog;
glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);
if (infologLength > 0)
{
infoLog = (char *)malloc(infologLength);
glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
string log = infoLog;
free(infoLog);
return log;
}
return "<Blank Log>";
}
和我正在加载的着色器:
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
void main(void)
{
gl_Position = ftransform();
}
总之我得到
From: ShaderCasher.cpp, In: loadShader(), Subject: Shader did not compile
Message: The shader Data/Shaders/Standard/standard.vs failed to compile, reporting the error - <Blank Log>
为我编译的每个着色器。
我尝试用一个硬编码的字符串替换文件读取但是我得到了同样的错误,所以我编译它们的方式肯定有问题。我已经使用着色器运行并编译了示例程序,因此我怀疑我的驱动程序是问题,但无论如何我都使用的是Nvidia 8600m GT。
有人可以帮忙吗?
答案 0 :(得分:4)
在loadFileRaw
中,您按值传递char *data
。然后你分配给它:
data = (char*)malloc(sizeof(char) * (*size + 1));
所以你的电话
loadFileRaw(filePath, file, &size);
不更改file
的值!要更改file
,请通过指针传递它:
loadFileRaw(filePath, &file, &size);
然后将您的功能更改为
bool loadFileRaw(string fileName, char** data, Uint* size) { ... }
并且在其中,
*data = (char*)malloc(sizeof(char) * (*size + 1));
等。 (对于data
)的其余引用。
那就是说,既然您正在使用C ++,请考虑使用std::vector<char>
或std::string
进行内存管理。为了帮助您入门,
{
std::vector<char> data;
data.resize(100); // now it has 100 entries, initialized to zero
silly_C_function_that_takes_a_char_pointer_and_a_size(&data[0], 100); // OK
} // presto, memory freed
此外,您可以考虑使用std::ifstream
来阅读文件,而不是使用FILE *
。
答案 1 :(得分:1)
尝试:
glShaderSource(newCashe.shader,1,&amp; pFile,NULL);
最常用的加载着色器源的调用。