我在模型绘图中大量绘制了大约一百万的正交表示。 (我会用一些旗帜画出这些东西)
相机也已实施。旋转等是可能的。
当我旋转模型时,所有这些正交表示将改变它们的位置。 所以,看起来,所有这些都在模型上的相同位置。
现在我想通过显卡绘制这些拼写的东西,因为当它们数量巨大时,模型旋转非常慢。
我觉得没有任何优势,因为每次我必须根据投影矩阵重新计算位置。
1)我说错了吗?
2)还请让我知道,当我使用opengl绘制批量拼写表示时,如何提高性能。
3)我也觉得实例化在这里不起作用,因为每个正交代表都是在2/3位置之间绘制的。我是对的吗?
答案 0 :(得分:1)
通常,OpenGL在绘制时为您进行投影计算:移交给GL的位置是世界或模型坐标,GL渲染使用模型 - 视图 - 投影矩阵(渲染时)来计算当前的屏幕坐标如果相机移动,唯一改变的是移交给GL的MVP矩阵。
这实际上并不取决于您使用的投影类型。所以我认为你不需要/应该更新数组中的位置。
答案 1 :(得分:1)
这是我的方法:
您创建一个顶点缓冲区,其中包含每个顶点位置6次和6个纹理坐标(如果您想用纹理绘制表示,则无论如何都需要),您可以在顶点着色器中创建四边形。您将模拟openGL投影,然后通过其纹理坐标偏移顶点以创建具有恒定大小的四边形。
构建模型时:
vector<vec3>* positionList = new vector<vec3>();
vector<vec2>* texCoordList = new vector<vec2>();
for (vector<vec3>::iterator it = originalPositions->begin(); it != originalPositions->end(); ++it) {
for (int i = 0; i < 6; i++) //each quad consists of 2 triangles, therefore 6 vertices
positionList->push_back(vec3(*it));
texCoordList->push_back(vec2(0, 0)); //corresponding texture coordinates
texCoordList->push_back(vec2(1, 0));
texCoordList->push_back(vec2(0, 1));
texCoordList->push_back(vec2(1, 0));
texCoordList->push_back(vec2(1, 1));
texCoordList->push_back(vec2(0, 1));
}
vertexCount = positionList->size();
glGenBuffers(1, &VBO_Positions); //Generate the buffer for the vertex positions
glBindBuffer(GL_ARRAY_BUFFER, VBO_Positions);
glBufferData(GL_ARRAY_BUFFER, positionList->size() * sizeof(vec3), positionList->data(), GL_STATIC_DRAW);
glGenBuffers(1, &VBO_texCoord); //Generate the buffer for texture coordinates, which we are also going to use as offset values
glBindBuffer(GL_ARRAY_BUFFER, VBO_texCoord);
glBufferData(GL_ARRAY_BUFFER, texCoordList->size() * sizeof(vec2), texCoordList->data(), GL_STATIC_DRAW);
顶点着色器:
void main() {
fs_texCoord = vs_texCoord;
vec4 transformed = (transform * vec4(vs_position, 1));
transformed.xyz /= transformed.w; //This is how the openGL pipeline does projection
vec2 offset = (vs_texCoord * 2 - 1) * offsetScale;
//Map the texture coordinates from [0, 1] to [-offsetScale, offsetScale]
offset.x *= invAspectRatio;
gl_Position = vec4(transformed.xy + offset, 0, 1);
//We pass the new position to the pipeline with w = 1 so openGL keeps the position we calculated
}
}
请注意,您需要自己调整宽高比,因为此处没有实际的正交矩阵可以为您执行此操作,即此行:
offset.x *= invAspectRatio;