C++ SFML-Opengl VAO问题给了我一个(1282)错误
我在尝试使用VAO的SFML内部时出错,不确定它是SFML还是我自己的opengl代码C++ SFML-Opengl VAO问题给了我一个(1282)错误,c++,opengl,sfml,opengl-3,opengl-4,C++,Opengl,Sfml,Opengl 3,Opengl 4,我在尝试使用VAO的SFML内部时出错,不确定它是SFML还是我自己的opengl代码 GLenum err = glewInit(); if (err != GLEW_OK) { std::cout << "NOT WORKING" << std::endl; } std::vector<sf::Vector3f> g_vertext_buffer_data; g_vertex_buffer_data.push_back({ -1.0f, -
GLenum err = glewInit();
if (err != GLEW_OK)
{
std::cout << "NOT WORKING" << std::endl;
}
std::vector<sf::Vector3f> g_vertext_buffer_data;
g_vertex_buffer_data.push_back({ -1.0f, -1.0f, 0.0f });
g_vertex_buffer_data.push_back({1.0f, -1.0f, 0.0f});
g_vertex_buffer_data.push_back({ 0.0f, 1.0f, 0.0f });
const char* vertexShaderSource =
"#version 330\n\
in vec4 position;\
void main(void){\ gl_Position = position;\
}";
// compile fragment shader source
const GLchar* fragmentShaderSource =
"#version 330\n\
void main(void) {\
out vec4 fragcolor; fragcolor= vec4(1.0,1.0,1.0,1.0);\
}";
/* Creating Shader */
this->programId = glCreateProgram();
this->vId = glCreateShader(GL_VERTEX_SHADER);
this->fId = glCreateShader(GL_FRAGMENT_SHADER);
/* Get Shader Size */
int vertexShaderLength = strlen(vertexShaderSource);
int fragmentShaderLength = strlen(fragmentShaderSource);
/* Loading and binding shader */
glShaderSource(this->vId, 1, &vertexShaderSource, NULL);
glShaderSource(this->fId, 1, &fragmentShaderSource, NULL);
/* Compile Shaders */
glCompileShader(vId);
glCompileShader(fId);
/* Attach Shaders */
glAttachShader(this->programId, this->vId);
glAttachShader(this->programId, this->fId);
/* Linkg program */
glLinkProgram(this->programId);
/* Use and bind attribute */
glUseProgram(this->programId);
this->positionId = glGetAttribLocation(this->programId, "position");
glUseProgram(0);
/* VAO Time */
glGenVertexArrays(1, &this->vaoId);
glBindVertexArray(this->vaoId);
/* VBO Time assigning to VAO */
glGenBuffers(1, &this->vboId);
glBindBuffer(GL_ARRAY_BUFFER, this->vboId);
glBufferData(GL_ARRAY_BUFFER, g_vertex_buffer_data.size() * sizeof(sf::Vector3f), &g_vertex_buffer_data[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(this->positionId);
glVertexAttribPointer(this->positionId, 2, GL_FLOAT, GL_FALSE, sizeof(sf::Vector3f), 0);
/* Close out bindings */
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
while(1)
{
glUseProgram(this->programId);
glBindVertexArray(this->vaoId);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glUseProgram(0);
gameWindow.glPushStates();
}
GLenum err=glewInit();
如果(错误!=GLEW_OK)
{
std::cout vId=glCreateShader(GL_顶点_着色器);
此->fId=glCreateShader(GL\u片段\u着色器);
/*获取着色器大小*/
int vertexShaderLength=strlen(vertexShaderSource);
int fragmentShaderLength=strlen(fragmentShaderSource);
/*加载和绑定着色器*/
glShaderSource(this->vId,1,&vertexShaderSource,NULL);
glShaderSource(此->fId,1,&fragmentShaderSource,NULL);
/*编译着色器*/
glCompileShader(vId);
glCompileShader(fId);
/*附加着色器*/
glAttachShader(this->programmaid,this->vId);
glAttachShader(此->程序ID,此->fId);
/*链接程序*/
glLinkProgram(此->程序ID);
/*使用和绑定属性*/
glUseProgram(此->程序ID);
此->位置ID=GLGetAttriblLocation(此->程序ID,“位置”);
glUseProgram(0);
/*VAO时间*/
glgenvertexarray(1,&this->vaoId);
glBindVertexArray(此->vaoId);
/*VBO时间分配给VAO*/
glGenBuffers(1,&this->vboId);
glBindBuffer(GL_数组_BUFFER,this->vboId);
glBufferData(GL_数组缓冲区、g_顶点缓冲区数据.size()*sizeof(sf::Vector3f)和g_顶点缓冲区数据[0],GL_静态图);
GlenableVertexAttributeArray(此->位置ID);
glvertexattributepointer(这个->位置ID,2,GL\u浮点,GL\u假,sizeof(sf::Vector3f),0);
/*收尾绑定*/
glBindVertexArray(0);
glBindBuffer(GL_数组_BUFFER,0);
而(1)
{
glUseProgram(此->程序ID);
glBindVertexArray(此->vaoId);
gldrawArray(GL_三角形,0,3);
glBindVertexArray(0);
glUseProgram(0);
gameWindow.glpushState();
}
我得到的错误代码是:用户代码中的opengl错误(1282)强>
我已更改了blBufferData()中提出的大小()问题,但仍然存在该问题。GLGetAttriblLocation的可能错误代码为:
GL_INVALID_OPERATION
没有固定值的。请尝试使用gluErrorString()
获取错误字符串,或查看标题中的1282个映射
•检查您的着色器是否编译无误
•检查着色器链接是否正确
什么类型有positionId
?所有对象id必须是GLuint
类型
顺便说一句,所有方式都支持着色器编译链接错误检查,调试将提供更多信息
我是这样做的(OpenGL ES 2.0):
在使用GLSL 3.3时,首先必须通过调用
glBindFragDataLocation(this->programId, 0, "fragcolor");
其次,片段着色器必须是
"#version 330
out vec4 fragcolor;
void main(void) {
fragcolor= vec4(1.0,1.0,1.0,1.0);
}
启用了使用此类着色器的示例。
glGetAttriblLocation
可能的错误代码如下:
GL_INVALID_OPERATION
没有固定值的。请尝试使用gluErrorString()
获取错误字符串,或查看标题中的1282个映射
•检查您的着色器是否编译无误
•检查着色器链接是否正确
什么类型有positionId
?所有对象id必须是GLuint
类型
顺便说一句,所有方式都支持着色器编译链接错误检查,调试将提供更多信息
我是这样做的(OpenGL ES 2.0):
在使用GLSL 3.3时,首先必须通过调用
glBindFragDataLocation(this->programId, 0, "fragcolor");
其次,片段着色器必须是
"#version 330
out vec4 fragcolor;
void main(void) {
fragcolor= vec4(1.0,1.0,1.0,1.0);
}
使用此类着色器的示例已打开。传递到
glBufferData
的大小至少存在问题:
glBufferData(GL_ARRAY_BUFFER,
sizeof(g_vertex_buffer_data) * sizeof(sf::Vector3f),
g_vertex_buffer_data[0], GL_STATIC_DRAW);
sizeof(g_vertex\u buffer\u data)
等于sizeof(std::vector)
,它是矢量对象的大小,而不是包含的数据的大小。请尝试使用
glBufferData(GL_ARRAY_BUFFER,
g_vertex_buffer_data.size() * sizeof(sf::Vector3f),
g_vertex_buffer_data[0], GL_STATIC_DRAW);
另一件事:在OpenGL 3.3核心概要文件中没有gl\u FragColor
变量。您必须定义一个out变量
下一步:顶点着色器似乎为空。必须写入
gl\u位置
,否则不会显示任何内容。传递到glBufferData
的大小至少有问题:
glBufferData(GL_ARRAY_BUFFER,
sizeof(g_vertex_buffer_data) * sizeof(sf::Vector3f),
g_vertex_buffer_data[0], GL_STATIC_DRAW);
sizeof(g_vertex\u buffer\u data)
等于sizeof(std::vector)
,它是矢量对象的大小,而不是包含的数据的大小。请尝试使用
glBufferData(GL_ARRAY_BUFFER,
g_vertex_buffer_data.size() * sizeof(sf::Vector3f),
g_vertex_buffer_data[0], GL_STATIC_DRAW);
另一件事:在OpenGL 3.3核心概要文件中没有gl\u FragColor
变量。您必须定义一个out变量
下一步:您的顶点着色器似乎为空。您必须写入
gl\u位置
,否则将不会显示任何内容。欢迎这样做!请将这些代码片段组装成一个,否则我们将不得不猜测未显示的代码中会发生什么。这是opengGl代码中使用的所有代码。因为我不确定问题在哪里我刚刚包括了所有的OpenGl代码。这里的MVCE定义得很好,如果没有它,你的问题就不会发生。我不会花时间编写一个测试应用程序来让你的代码片段可以运行,我怀疑其他人会这样做。欢迎这么做!请将这些代码片段组装成一个,否则我们就没有了o猜猜在未显示的代码中发生了什么。这是opengGl代码中使用的所有代码。由于我不确定问题与何处有关,我只包含了所有OpenGl代码。这里被认为是MVCE的定义非常好,如果没有它,你的问题就不会发生。我不会花时间编写测试应用程序来生成你的代码片段是可运行的,我怀疑其他人是否会运行。好吧,所以我继续在gLinkProgram之前放置:glBindAttribLocation(this->programmaid,0,“position”)…但我仍然得到相同的错误。@user5600884:什么类型的havepositionId
?1282是一个GL\u无效的\u操作?因此,当我使用着色器编译时,请检查顶点着色器是否编译良好,但片段着色器未编译正常。@user5600884:问题在于将片段着色器代码粘贴到您的问题中,我们将对此进行调查。好的所以我去了