Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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/9/loops/2.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++ 在某些平台上损坏的OpenGL渲染_C++_Opengl_Graphics_Hardware_Glm Math - Fatal编程技术网

C++ 在某些平台上损坏的OpenGL渲染

C++ 在某些平台上损坏的OpenGL渲染,c++,opengl,graphics,hardware,glm-math,C++,Opengl,Graphics,Hardware,Glm Math,我一直在尝试批处理sprite渲染,我已经找到了一种在台式电脑上运行良好的解决方案。但是,在我的集成Intel UHD 620笔记本电脑上尝试时,我得到了以下性能警告: [21:42:03 error] OpenGL: API - Performance - Recompiling fragment shader for program 27 [21:42:03 error] OpenGL: API - Performance - multisampled FBO 0->1

我一直在尝试批处理sprite渲染,我已经找到了一种在台式电脑上运行良好的解决方案。但是,在我的集成Intel UHD 620笔记本电脑上尝试时,我得到了以下性能警告:

[21:42:03   error] OpenGL: API - Performance - Recompiling fragment shader for program 27
[21:42:03   error] OpenGL: API - Performance -   multisampled FBO 0->1
大概是因为这些性能警告的来源,在我的专用图形卡机器上需要1-2毫秒的帧在我的笔记本电脑上大约需要100毫秒

以下是我的渲染器代码:

BatchedSpriteRender::BatchedSpriteRender(资源管理器和资源管理器)
:资源管理器(&资源管理器),
最大精灵数(100000),
顶点数组(std::make_unique()),
顶点缓冲区(std::make_unique())
{
资源\u管理器。加载\u着色器(“批处理的\u纹理”,
“着色器/纹理\u批处理.vert”,
“着色器/纹理.frag”);
向量sprite_指数;
对于(int i=0;i添加顶点缓冲区(*顶点缓冲区,布局);
}
void batchedsspriterenderer::draw(const std::string和texture,
常量std::向量和变换,
常量glm::mat4和视图)
{
顶点数组->绑定();
自动着色器=资源管理器->着色器存储.get(“批处理纹理”);
着色器->绑定();
向量顶点;
顶点保留(transforms.size()*4);
用于(常量自动和变换:变换)
{
glm::vec4 transformed_position=transform*glm::vec4(0.0,1.0,1.0,1.0);
顶点.push_back({glm::vec2(transformed_position.x,transformed_position.y),
glm::vec2(0.0,1.0),
glm::vec4(1.0,1.0,1.0,1.0)});
变换的位置=变换*glm::vec4(0.0,0.0,1.0,1.0);
顶点.push_back({glm::vec2(transformed_position.x,transformed_position.y),
glm::vec2(0.0,0.0),
glm::vec4(1.0,1.0,1.0,1.0)});
变换的位置=变换*glm::vec4(1.0,0.0,1.0,1.0);
顶点.push_back({glm::vec2(transformed_position.x,transformed_position.y),
glm::vec2(1.0,0.0),
glm::vec4(1.0,1.0,1.0,1.0)});
变换的位置=变换*glm::vec4(1.0,1.0,1.0,1.0);
顶点.push_back({glm::vec2(transformed_position.x,transformed_position.y),
glm::vec2(1.0,1.0),
glm::vec4(1.0,1.0,1.0,1.0)});
}
顶点缓冲区->添加顶点数据(顶点.data(),
sizeof(SpriteVertex)*顶点。大小(),
GL(动态绘制);
着色器->设置统一材质(“u视图”,视图);
着色器->设置统一纹理(u纹理,0);
资源管理器->纹理存储.get(纹理)->bind();
GLD元素(GL_三角形,transforms.size()*6,GL_UNSIGNED_INT,0);
}
希望我的抽象应该是不言自明的。每个抽象类(
VertexArray
VertexBuffer
ElementBuffer
VertexBufferLayout
)管理其等效OpenGL对象的生存期

以下是正在使用的着色器:
texture\u批处理的.vert

#version 430 core

layout(location = 0)in vec2 v_position; 
layout(location = 1)in vec2 v_tex_coord; 
layout(location = 2)in vec4 v_color; 

out vec4 color; 
out vec2 tex_coord; 

uniform mat4 u_view;

void main()
 {
    tex_coord = v_tex_coord;
    gl_Position = u_view * vec4(v_position, 0.0, 1.0);
    color = v_color;
}
texture.frag

#version 430 core

in vec4 color; 
in vec2 tex_coord; 

out vec4 frag_color; 

uniform sampler2D u_texture; 

void main()
 {
    frag_color = texture(u_texture, tex_coord);
    frag_color *= color;
}
是什么导致了这些性能问题,我如何修复它们

编辑:我完全忘了提到用这个渲染的实际图像完全混乱了,我会尝试在我的桌面PC上抓取一个正常工作的屏幕截图,但下面是损坏的版本的样子:

它应该是一个由200x200个白色圆圈组成的整齐网格


编辑2:我在另一台电脑上试过,这次是GTX1050TI,它也坏了。这次没有错误消息或警告。该警告可能与此无关。

据我所知,它最终与OpenGL无关

在draw函数中,我创建了一个名为
顶点
的向量,然后将所有顶点放入其中。出于某种原因,当我每帧重新创建一个向量时,下面的
push_back
调用没有正确地添加到向量中。
SpriteVertex
结构的成员被搞混了。因此,不是正确的布局:

pos tex_coord color
pos tex_coord color
pos tex_coord color
pos tex_coord color
它被填充在以下布局中:

pos tex_coord color
tex_coord pos color
tex_coord pos color
tex_coord pos color
或者至少是这样的

我更改了它,使
顶点
向量是
批处理spriterenderer
类的成员,为最大可能数量的顶点保留了空间

void batchedsspriterenderer::draw(const std::string&texture,
常量std::向量和变换,
常量glm::mat4和视图)
{
顶点数组->绑定();
自动着色器=资源管理器->着色器存储.get(“批处理纹理”);
着色器->绑定();
for(无符号整数i=0;i