gpt4 book ai didi

performance - 为什么这个 OpenGL 3 顶点着色器非常慢?

转载 作者:行者123 更新时间:2023-12-04 23:52:02 24 4
gpt4 key购买 nike

我有以下顶点着色器:

#version 150

in vec4 position;
in vec2 texture;
in int layer;

out vec2 pass_texture;
out float pass_layer;

uniform mat4 _modelToClipMatrix;
uniform float layerDepth[255];

void main (void)
{
gl_Position = _modelToClipMatrix*vec4(position.xy,layerDepth[layer]/255,position.w);
// gl_Position = _modelToClipMatrix*position;
pass_layer = float(layer);
pass_texture = texture;
}

当我按这里的方式使用它时,我的帧速率约为 7 FPS。如果我使用第二行(已注释掉)而不是第一行,我的帧速率会跳到大约 50 FPS。看来数组查找是这里的大问题。为什么这么慢?如何在保持功能的同时提高性能?

我的硬件是 ATI Radeon HD 4670 256 MB(iMac 2010 型号)。

我的顶点结构如下:

typedef struct
{
floatVector2 position; //2*4=8
uByteVector2 textureCoordinate; //2*1=2
GLubyte layer; //1
} PCBVertex;

然后我按以下方式设置 op 缓冲区:

glVertexAttribPointer((GLuint)positionAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(PCBVertex), (const GLvoid *)offsetof(PCBVertex, position));
glVertexAttribPointer((GLuint)textureAttribute, 2, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(PCBVertex), (const GLvoid *)offsetof(PCBVertex, textureCoordinate));
glVertexAttribIPointer(layerAttribute, 1, GL_UNSIGNED_BYTE, sizeof(PCBVertex), (const GLvoid *)offsetof(PCBVertex, layer));

一些背景信息:我正在制作一个绘图包。用户可以在多个图层上绘制。一层是事件的,它被绘制在最前面。他还可以“翻转”图层,就好像从另一边看一样。我认为当图层顺序更改时更新所有顶点效率很低,所以我给每个顶点一个图层编号并查找其在制服中的当前位置(我只发送 x 和 y 作为位置数据)。另外,作为旁注:片段着色器使用相同的层号来确定颜色,也使用统一数组。

最佳答案

如果你去掉那行

gl_Position = _modelToClipMatrix*vec4(position.xy,layerDepth[layer]/255,position.w);

在您的着色器中,统一的 float layerDepth[255]; 将不再使用。这意味着编译器会将其优化掉。

此外,layerAttribute 位置将变为 -1,从而阻止此属性指针的任何数据传输。

关于performance - 为什么这个 OpenGL 3 顶点着色器非常慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12375463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com