C++ 在某些平台上损坏的OpenGL渲染
我一直在尝试批处理sprite渲染,我已经找到了一种在台式电脑上运行良好的解决方案。但是,在我的集成Intel UHD 620笔记本电脑上尝试时,我得到了以下性能警告: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
[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