gpt4 book ai didi

c++ - 不支持 512 字节长度的顶点着色器

转载 作者:太空宇宙 更新时间:2023-11-04 15:59:09 25 4
gpt4 key购买 nike

我正在开发一个基于着色器的简单游戏,随着我的顶点着色器文件变大,它的大小达到 512 字节,我现在无法用 C++ 加载它。我不认为这是一个常见问题,但我猜它来 self 的自定义着色器加载器,而不是来自 opengl 限制。这是我的简单顶点着色器的代码(它应该将笛卡尔坐标映射到球坐标,它的大小是 583 字节):

#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 终止符,然后您调用 glShaderSource 的长度 vector 为 NULL,因此它将寻找 NUL 终止符来计算字符串的长度。所以我希望它会随机失败,具体取决于字符串后内存中发生的情况(它是否幸运地显示为 NUL 终止,因为下一个字节是否为 0)。

您需要正确地以 NUL 终止字符串,或者将指向字符串长度的指针作为 glShaderSource 的第 4 个参数传递给

关于c++ - 不支持 512 字节长度的顶点着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48736390/

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