openGL,GLFW,glShaderSource 上的 1281 错误,下一个 glShaderSource 以某种方式工作正常
openGL, GLFW, 1281 error on glShaderSource, the very next glShaderSource works fine somehow
我一直在努力让着色器工作。他们没有。
std::cout << "a " << glGetError() <<std::endl; //making sure things work
GLuint vertexShader = 0;
GLuint fragmentShader = 1;
glCreateShader(GL_VERTEX_SHADER);
std::cout <<"b " << glGetError() <<std::endl;
glCreateShader(GL_FRAGMENT_SHADER);
std::cout <<"c " << glGetError() <<std::endl;
glShaderSource(vertexShader, GLsizei(1), (const char**)&VertexShaderSource, NULL);//ERROR
std::cout <<"d " << glGetError() <<std::endl;
glShaderSource(fragmentShader, GLsizei(1), (const char**)&FragmentShaderSource, NULL);//is somehow fine
std::cout <<"e " << glGetError() <<std::endl;
glCompileShader(vertexShader);
std::cout <<"f " << glGetError() <<std::endl;
glCompileShader(fragmentShader);
std::cout <<"g " << glGetError() <<std::endl;'
现在,输出是:
a 0
b 0
c 0
d 1281
e 0
f 1281
g 0
这意味着第一个 glShaderSource
调用不起作用,但出于某种原因,下一个 glShaderSource
起作用了,而我认为是完全相同的事情。
这是怎么回事???
着色器是:
const std::string VertexShaderSource ="#version 330 core"
""
"layout (location = 0) in vec3 position;"
""
"void main()"
"{"
" gl_Position = vec4(position.x, position.y, position.z, 1.0);"
"}";
const std::string FragmentShaderSource ="#version 330 core"
""
"out vec4 color;"
""
"void main()"
"{"
" color = vec4(1.0f, 1.0f, 1.0f, 1.0f);"
"}";
如果以这种方式传递字符串 ((const char**)&VertexShaderSource)
是错误的,那么为什么第二次调用工作正常?
你传递的字符串有误,正确的方法是VertexShaderSource.c_str()
。
您必须将 vertexShader
和 fragmentShader
设置为 glCreateShader
的结果,而不是将其硬编码为 0
和 1
.
GLuint vertexShader;
GLuint fragmentShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
std::cout <<"b " << glGetError() <<std::endl;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
std::cout <<"c " << glGetError() <<std::endl;
函数glCreateShader
returns 0
如果调用不成功。
在您的代码中,您将 vertexShader
硬编码为 0
,并且 opengl 报告 glShaderSource(vertexShader, ...
错误,因为您将 0
作为 ID 传递给 glShaderSource
.
1281
是一个 GL_INVALID_VALUE
错误并被报告 if shader is not a value generated by OpenGL.
glShaderSource: Errors
除此之外,您 (const char**)&VertexShaderSource
获取 std::string
存储您必须使用的数据的内存地址是错误的 .c_str()
:
How to pass an std::string to glShaderSource?
我一直在努力让着色器工作。他们没有。
std::cout << "a " << glGetError() <<std::endl; //making sure things work
GLuint vertexShader = 0;
GLuint fragmentShader = 1;
glCreateShader(GL_VERTEX_SHADER);
std::cout <<"b " << glGetError() <<std::endl;
glCreateShader(GL_FRAGMENT_SHADER);
std::cout <<"c " << glGetError() <<std::endl;
glShaderSource(vertexShader, GLsizei(1), (const char**)&VertexShaderSource, NULL);//ERROR
std::cout <<"d " << glGetError() <<std::endl;
glShaderSource(fragmentShader, GLsizei(1), (const char**)&FragmentShaderSource, NULL);//is somehow fine
std::cout <<"e " << glGetError() <<std::endl;
glCompileShader(vertexShader);
std::cout <<"f " << glGetError() <<std::endl;
glCompileShader(fragmentShader);
std::cout <<"g " << glGetError() <<std::endl;'
现在,输出是:
a 0
b 0
c 0
d 1281
e 0
f 1281
g 0
这意味着第一个 glShaderSource
调用不起作用,但出于某种原因,下一个 glShaderSource
起作用了,而我认为是完全相同的事情。
这是怎么回事???
着色器是:
const std::string VertexShaderSource ="#version 330 core"
""
"layout (location = 0) in vec3 position;"
""
"void main()"
"{"
" gl_Position = vec4(position.x, position.y, position.z, 1.0);"
"}";
const std::string FragmentShaderSource ="#version 330 core"
""
"out vec4 color;"
""
"void main()"
"{"
" color = vec4(1.0f, 1.0f, 1.0f, 1.0f);"
"}";
如果以这种方式传递字符串 ((const char**)&VertexShaderSource)
是错误的,那么为什么第二次调用工作正常?
你传递的字符串有误,正确的方法是VertexShaderSource.c_str()
。
您必须将 vertexShader
和 fragmentShader
设置为 glCreateShader
的结果,而不是将其硬编码为 0
和 1
.
GLuint vertexShader;
GLuint fragmentShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
std::cout <<"b " << glGetError() <<std::endl;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
std::cout <<"c " << glGetError() <<std::endl;
函数glCreateShader
returns 0
如果调用不成功。
在您的代码中,您将 vertexShader
硬编码为 0
,并且 opengl 报告 glShaderSource(vertexShader, ...
错误,因为您将 0
作为 ID 传递给 glShaderSource
.
1281
是一个 GL_INVALID_VALUE
错误并被报告 if shader is not a value generated by OpenGL.
glShaderSource: Errors
除此之外,您 (const char**)&VertexShaderSource
获取 std::string
存储您必须使用的数据的内存地址是错误的 .c_str()
:
How to pass an std::string to glShaderSource?