如何在OpenGL中将纹理应用于子网格?

问题描述 投票:0回答:1

我有一个网格,我将其划分为子网格,并通过使用顶点的索引进行单独绘制。但是,我想知道将不同图像应用于不同子网格的最有效方法是什么。这些子网格被单独绘制。例如,这是一个子网格。

mat4 view = identity_mat4();
mat4 persp_proj = perspective(100.0f, (float)width / (float)height, 0.1f, 100.0f);
mat4 model = identity_mat4();
model = rotate_y_deg(model, turn);
model = translate(model, vec3(ahead_x, 0.0f, ahead_z));
view = translate(view, vec3(0.0, 0.0, -5.0f));

// update uniforms & draw
glUniformMatrix4fv(proj_mat_location, 1, GL_FALSE, persp_proj.m);
glUniformMatrix4fv(view_mat_location, 1, GL_FALSE, view.m);
glUniformMatrix4fv(matrix_location, 1, GL_FALSE, model.m);
//glDrawElements(GL_TRIANGLES, mesh_data.mPointCount, GL_UNSIGNED_INT, 0);
glDrawArrays(GL_TRIANGLES, wheels[0], wheels[1] - wheels[0]);

有没有简单的方法可以实现这一目标?我当时正在考虑为绘制的每个网格绑定适当的图像,但是由于我的所有VBO管理都是在不同的功能中完成的,因此我认为它可能过于复杂。谢谢。

c++ opengl graphics texture-mapping
1个回答
0
投票

通常,所有子/网格将具有不同的材质和图像图。通常,它们还需要使用不同的着色器,因为表面需要不同的BRDF(双向反射率分布函数)来传达对象的外观。

因此,您不应该认为拥有单独的纹理本质上是不好的。如果对象或子网格不多,则可以在每次绘制时设置纹理,然后将其保留。

由于您的绘制计数将接近每帧数百个调用,因此您可能会看到CPU负载越来越高,而fps下降了。这是您需要重新考虑方法的时候,没有灵丹妙药。 “最有效的”是每次都会有所不同,具体取决于您需要绘制的内容。

为了最简单的优化,您需要对对象进行重新排序,因此将首先绘制具有相同着色器/纹理的对象,并且不必在绘制多个子网格之间更改纹理。

更复杂的优化将要求您将具有相同材质的多个子网格合并到一个更大的网格中,因此将在一个绘制调用中进行绘制。此时,您甚至可以即时创建更大的纹理(称为“纹理图集”),将多个图像组合为一个纹理,然后重新定位子网格的纹理坐标以指向此新的更大图像的正确部分。当存在许多纹理较小的对象(例如精灵)时,此效果特别好。

简而言之,当您知道每帧必须绘制数百个对象时,就开始进行复杂的设计。对于更简单的场景,可以在每次绘制调用时绑定子网格的纹理。

© www.soinside.com 2019 - 2024. All rights reserved.