我的glsl着色器加载代码有什么问题吗
Is there anything wrong with my glsl shader loading code?
问题是,着色器(非常简单的着色器,因为我正在学习OpenGL(无法以看似随机的方式编译(并给出随机错误消息*(。但是,相同的着色器会在大约3或4次尝试后编译。这是代码:
Shader::Shader(GLenum Type,std::string filename)
{
shader_type = Type;
std::ifstream ifs(filename);
if(!ifs)
throw(std::runtime_error("File:"+filename+" not opened."));
std::ostringstream stream;
stream<<ifs.rdbuf();
const GLchar* data = stream.str().c_str();
handle = glCreateShader(shader_type);
glShaderSource(handle,1,static_cast<const GLchar**>(&data),0);
glCompileShader(handle);
int status;
glGetShaderiv(handle,GL_COMPILE_STATUS,&status);
if(status == GL_FALSE)
{
int loglength;
glGetShaderiv(handle,GL_INFO_LOG_LENGTH,&loglength);
auto data = new char[loglength];
glGetShaderInfoLog(handle,loglength,&loglength,data);
std::string strdata(data);
delete [] data;
throw(std::runtime_error(strdata));
}
}
请注意,着色器末尾没有缺少换行符,在最后一个分号后有一个额外的空格,并使用制表符而不是空格。(如互联网上的各种旧帖子中所建议的!(。
- 以下是由同一顶点着色器生成的两条错误消息,并非同时生成:
#version 330
in vec2 Position;
uniform mat4 transform;
void main()
{
gl_Position = transform*vec4(Position,0.0f,1.0f);
}
错误:
0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
0(6) : error C0000: syntax error, unexpected '!', expecting ',' or ')' at token "!"
有时它只是起作用!我的司机有问题吗?(我在Arch Linux 64位上使用了最新的302.x稳定的nvidia二进制驱动程序,带有一个旧的9600 GSO卡(
p.S:只要着色器编译正确,代码就会按预期工作,所以我认为它应该是正确的。如果找不到问题,并且有人想看一看,我很乐意发布一个工作(有时!(的例子作为zip文件。
const GLchar* data = stream.str().c_str();
这太糟糕了。如果您想要字符串的数据,您需要存储它。str
将返回缓冲区的副本,然后使用c_str
获取指向该副本的指针。一旦该临时内存被销毁(在此行的末尾(,指针将指向您不再可以访问的内存。
正确的代码是:
std::string dataString = stream.str();
const GLchar *data = reinterpret_cast<GLchar*>(dataString.c_str());
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了