512字节长度顶点着色器不支持
512 bytes length vertex shaders not supported
我正在研究一个基于着色器的简单游戏,并且随着我的顶点着色器文件的长大,它的大小达到512字节,现在我无法将其加载到C 中。我认为这不是一个常见的问题,但我想这是来自我的自定义着色器加载程序,而不是来自OpenGL限制。在这里,我简单的顶点着色器的代码(应该将笛卡尔坐标映射到球形坐标,其大小为583 bytes(:
#version 330 core
uniform mat4 projection;
uniform mat4 camera;
layout (location=0) in vec3 vertex;
layout (location=1) in vec4 color;
in mat4 object;
out vec4 vColor;
void main()
{
float x=sqrt(max(1.0-0.5*pow(vertex.y,2)-0.5*pow(vertex.z,2)+pow(vertex.y*vertex.z,2)/3.0,0.0));
float y=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.z,2)+pow(vertex.x*vertex.z,2)/3.0,0.0));
float z=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.y,2)+pow(vertex.x*vertex.y,2)/3.0,0.0));
gl_Position=projection*camera*object*vec4(x,y,z,1.0);
vColor=color;
}
和加载程序的代码:
GLuint vs;
vs=glCreateShader(GL_VERTEX_SHADER);
std::ifstream vertexShaderStream(_vsPath);
vertexShaderStream.seekg(0,std::ios::end);
unsigned int vsSourceLen=(unsigned int)vertexShaderStream.tellg();
vertexShaderStream.seekg(0,std::ios::beg);
char vertexShaderSource[vsSourceLen];
vertexShaderStream.read(vertexShaderSource,vsSourceLen);
vertexShaderStream.close();
const char *vsConstSource(vertexShaderSource);
glShaderSource(vs,1,&vsConstSource,NULL);
glCompileShader(vs);
int status;
glGetShaderiv(vs,GL_COMPILE_STATUS,&status);
if(!status)
{
char log[256];
glGetShaderInfoLog(vs,sizeof log,NULL,log);
std::cout << log << std::endl;
return -1;
}
当我将尺寸降低到512bytes(2^9 ...((511及更少(时,它效果很好。我正在使用glfw3加载OpenGL。您曾经看到过这样的问题吗?
一个问题是,您是在使用read
的char[]
缓冲区中读取着着色器源,而无需添加NUL终结器,然后您将使用null拨打 glShaderSource
for null for lenghw vector,所以将寻找一个nul终结器来找出字符串的长度。因此,我希望这会随机失败,具体取决于字符串后的内存中发生的情况(是否幸运地显示为NUL终止,因为下一个字节发生在0(。
您需要正确地终止字符串,或将指针传递给字符串的长度作为第四参数,转换为glShaderSource
添加std :: ifstream ::二进制作为ifstream构造函数中的第二个参数解决了问题。我不完全理解为什么当文件的长度达到512字节并添加一些随机字节以匹配实际大小时,默认情况下,默认情况下将文件视为文本文件的ifstream会停止计数行的结尾。无论如何,使用ifstream当然不是加载文件的最佳方法,而是仅仅与着色器打交道,我会说这没关系(带有适当的" ios :: binary"标志(。
相关文章:
- 为什么istream不支持右值提取
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 为什么C++不支持对未初始化变量进行智能分析?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 为什么联机C++ IDE 不支持"graphics.h"头文件?
- Clang编译器不支持aarch64-apple-darwin上的-fxray-instrument
- 为什么我的 clang 格式不支持 PPDirectiveIndentStyle 选项?
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 为什么不支持 Xcode 1.5?
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 为什么结构化绑定不支持可变数组?
- 您选择的 CPU 不支持 x86-64 指令集
- 将数据发送到多个客户端 UDP 时不支持地址族
- 缺少类型说明符 - 假定为 int.注意 c++ 不支持 default-int
- 瓦尔格林德"不支持arch_prctl选项"
- 错误:C4430:缺少类型说明符-假定为int.注意:C++不支持default-int
- 不支持 GLSL 330 内核
- 512字节长度顶点着色器不支持