Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLDrawArray仅在我将;“错误”;数据_C++_Opengl - Fatal编程技术网

C++ GLDrawArray仅在我将;“错误”;数据

C++ GLDrawArray仅在我将;“错误”;数据,c++,opengl,C++,Opengl,我正在写一个程序,用一个从顶点数组获取数据的着色器在屏幕上绘制简单的块。顶点数组是一个浮动数组,按以下顺序将x、y、z位置值与u、v纹理值组合在一起: [x1,y1,z1,u1,v1,x2,y2,z2,u2,v2,…] 我像这样创建了缓冲区(数据是我前面用数据填充的向量对象): 后来我这样画: glUseProgram(city_shader); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glActiveTexture

我正在写一个程序,用一个从顶点数组获取数据的着色器在屏幕上绘制简单的块。顶点数组是一个浮动数组,按以下顺序将x、y、z位置值与u、v纹理值组合在一起:

[x1,y1,z1,u1,v1,x2,y2,z2,u2,v2,…]

我像这样创建了缓冲区(数据是我前面用数据填充的向量对象):

后来我这样画:

glUseProgram(city_shader);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glActiveTexture(GL_TEXTURE0);

glUniformMatrix4fv(mvpMatrixID, 1, GL_FALSE, &mvp_matrix[0][0]);
glBindTexture(GL_TEXTURE_2D, texture.tex);
glUniform1i(textureID, 0);
glBindBuffer(GL_ARRAY_BUFFER, data_buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GL_FLOAT), (void*)0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GL_FLOAT), (void*)(3 * sizeof(GL_FLOAT)));

glDrawArrays(GL_QUADS, 0, data.size()/5);

glBindTexture(GL_TEXTURE_2D, 0);
glUseProgram(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
但这只会产生一个空白屏幕:

起初,我认为我的着色器有问题。但是,我注意到,当我将步幅改为glvertexattributepointer时,如下所示:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (void*)0); //Stride is now only 4, when there are 5 elements per vertex
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GL_FLOAT), (void*)(3 * sizeof(GL_FLOAT)));
我得到以下(损坏的)图像:

这使我相信,着色器和其他图形调用实际上工作正常(即,它们正确地应用了纹理并变换了顶点),但仅当提供给它们的数据在某种程度上是错误的时。只有当我弄坏缓冲区顶点属性的步长时,我才能绘制一些东西。有什么关于原因的建议吗

编辑:另外,我插入了对glGetError()的调用,但没有结果

EDIT2:根据Peppe的请求,以下是我的着色器的代码:

顶点着色器:

#version 430 core
layout(location = 0) in vec3 pos;
layout(location = 1) in vec2 uv_coords;
uniform mat4 mvpMatrix;
out vec2 vs_uv;
void main()
{
vs_uv = uv_coords;
gl_Position = mvpMatrix * vec4(pos,1.0);
}
片段着色器:

#version 430 core
in vec2 vs_uv;
uniform sampler2D tex;
out vec4 fs_color;
void main()
{
fs_color = vec4(texture(tex,vs_uv));
}
以及填充缓冲区的代码子集:

//West wall - x-axis increases
    float base_x_texture_coord = gen_random_x_texture_coord();
    float base_y_texture_coord = gen_random_y_texture_coord();
    data.push_back(segment_pos_x + half_x_width); data.push_back(0.0f); data.push_back(segment_pos_z + half_z_width);
    data.push_back(base_x_texture_coord); data.push_back(base_y_texture_coord);
    data.push_back(segment_pos_x + half_x_width); data.push_back(height); data.push_back(segment_pos_z + half_z_width);
    data.push_back(base_x_texture_coord); data.push_back(base_y_texture_coord + height);
    data.push_back(segment_pos_x + half_x_width); data.push_back(height); data.push_back(segment_pos_z - half_z_width);
    data.push_back(base_x_texture_coord + z_width); data.push_back(base_y_texture_coord + height);
    data.push_back(segment_pos_x + half_x_width); data.push_back(0.0f); data.push_back(segment_pos_z - half_z_width);
    data.push_back(base_x_texture_coord + z_width); data.push_back(base_y_texture_coord);

明白了!事实证明,我的绘图代码工作正常,但我为正方形的位置生成的坐标太远,无法绘制正方形。无论如何感谢您的帮助。

您是否确保属性0与位置的顶点着色器输入相关联,属性1与纹理坐标的输入相关联?您可以在着色器代码中使用
glgetAttriblation()
glbindAttriblation()
layout(location=…)
指令之类的调用。在大多数平台上,这不应该是个问题,但您确实非常想编写
sizeof(GLfloat)
,而不是
sizeof(GL_FLOAT)
。(这不是问题,因为单精度浮点和整数的大小都是4字节,
GL\u float
宏的扩展)。此外,请停止使用四元组绘图。这在Core profile中不再受支持。RetoKoradi:我已确认属性设置正确,在着色器中,它们在vec3 pos中定义为布局(位置=0);vec2紫外坐标中的布局(位置=1);谢谢你的提示,我已经修改了我的代码,用GLfloat代替GL_FLOAT,但是没有解决方案。将来,我会将渲染器转换为使用三角形,但我想先解决这个问题。我不确定
sizeof(GL\u FLOAT)
必须是32位
GLenum
是一种32位类型,但OpenGL使用的常量值都限于较低的16位。通常,整数文本将是32位的,但不必是32位。无论常数的大小如何,都不希望使用:P
//West wall - x-axis increases
    float base_x_texture_coord = gen_random_x_texture_coord();
    float base_y_texture_coord = gen_random_y_texture_coord();
    data.push_back(segment_pos_x + half_x_width); data.push_back(0.0f); data.push_back(segment_pos_z + half_z_width);
    data.push_back(base_x_texture_coord); data.push_back(base_y_texture_coord);
    data.push_back(segment_pos_x + half_x_width); data.push_back(height); data.push_back(segment_pos_z + half_z_width);
    data.push_back(base_x_texture_coord); data.push_back(base_y_texture_coord + height);
    data.push_back(segment_pos_x + half_x_width); data.push_back(height); data.push_back(segment_pos_z - half_z_width);
    data.push_back(base_x_texture_coord + z_width); data.push_back(base_y_texture_coord + height);
    data.push_back(segment_pos_x + half_x_width); data.push_back(0.0f); data.push_back(segment_pos_z - half_z_width);
    data.push_back(base_x_texture_coord + z_width); data.push_back(base_y_texture_coord);