Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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_Texture Mapping - Fatal编程技术网

C++ 如何在OpenGL中将纹理应用于子画面?

C++ 如何在OpenGL中将纹理应用于子画面?,c++,opengl,graphics,texture-mapping,C++,Opengl,Graphics,Texture Mapping,我有一个单独的网格,我已经将其划分为子网格,并使用顶点的索引分别绘制。但是,我想知道,将不同的图像应用到不同的子页面上的最有效方法是什么。这些子画面是单独绘制的。例如,这是一个子网格 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

我有一个单独的网格,我已经将其划分为子网格,并使用顶点的索引分别绘制。但是,我想知道,将不同的图像应用到不同的子页面上的最有效方法是什么。这些子画面是单独绘制的。例如,这是一个子网格

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管理都是在不同的函数中完成的,我认为这可能过于复杂。谢谢。

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

所以你不应该认为有单独的纹理本质上是不好的。如果没有太多的对象或子图形,可以在每次绘制时设置纹理,并保持这样

当您的绘制计数接近每帧数百个调用时,您可能会看到cpu负载越来越高,fps也在下降。这是你需要重新思考方法的时候,没有什么灵丹妙药。“最有效的”是每次都会有所不同,这取决于你需要画的东西

对于最简单的优化,您需要对绘制对象重新排序,以便首先绘制具有相同着色器/纹理的对象,并且不必在绘制多个子图之间更改纹理

更复杂的优化将需要将具有相同材质的多个子网格合并到一个更大的网格中,因此它将在单个绘制调用中绘制。此时,您甚至可以动态创建更大的纹理(称为“纹理图谱”),将多个图像合并到一个纹理中,并重新定位子画面的纹理坐标,以指向新的更大图像的正确部分。当有许多具有小纹理的对象(如精灵)时,这种方法尤其有效


简而言之,当你知道每一帧都要画几百个对象时,就开始做复杂的设计。对于更简单的场景,可以在每次绘制调用时绑定子网格的纹理。

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

所以你不应该认为有单独的纹理本质上是不好的。如果没有太多的对象或子图形,可以在每次绘制时设置纹理,并保持这样

当您的绘制计数接近每帧数百个调用时,您可能会看到cpu负载越来越高,fps也在下降。这是你需要重新思考方法的时候,没有什么灵丹妙药。“最有效的”是每次都会有所不同,这取决于你需要画的东西

对于最简单的优化,您需要对绘制对象重新排序,以便首先绘制具有相同着色器/纹理的对象,并且不必在绘制多个子图之间更改纹理

更复杂的优化将需要将具有相同材质的多个子网格合并到一个更大的网格中,因此它将在单个绘制调用中绘制。此时,您甚至可以动态创建更大的纹理(称为“纹理图谱”),将多个图像合并到一个纹理中,并重新定位子画面的纹理坐标,以指向新的更大图像的正确部分。当有许多具有小纹理的对象(如精灵)时,这种方法尤其有效

简而言之,当你知道每一帧都要画几百个对象时,就开始做复杂的设计。对于更简单的场景,可以在每次绘制调用时绑定子画面的纹理。

另一种方法是使用ant通过统一变量设置第三个纹理坐标。当然,所有二维图像都必须具有相同的大小。另一种方法是使用ant通过统一变量设置第三个纹理坐标。当然,所有二维图像都必须具有相同的大小。