想要将多个不规则纹理贴在曲面上(网格与 xyz 顶点和每个指定的 uv)。我正在从模型文件加载网格,并且对表面没有任何先验知识......我们所知道的是它将具有“合理”的 uv 映射。想要选择一些 uv 区域并将纹理应用到它们。每个区域由 uv 坐标中的边界多边形指定。在这种情况下不知道等效的 xyz poly,或者我认为答案很简单。
我们对平面和简单的圆柱表面(我们将其近似为一系列扁平条纹,通过选择法线作为平均值进行平滑)进行了这种工作。在这两种情况下,我们都知道从 uv 到 xyz 的唯一映射,因此我们设置模板缓冲区以通过在绑定纹理和绘制真实表面之前将等效的 xyz 多边形绘制到模板缓冲区来限制绘制到所需的 uv 区域。
在将纹理贴到表面时,我们还在纹理中使用 rgba 透明度。通常每个纹理区域都是一个小的旋转矩形,因此我们将四个顶点绘制到模板缓冲区,然后使用纹理矩阵旋转它,并使用纹理中的 rgba 透明度来确保仅应用纹理的右侧部分。这一切都很好。
想重用我们的工作代码,但现在将这些纹理应用于任意曲面/网格。我们正在加载和绘制这些模型,并且已经可以将纹理应用于整个面[即 uv 从 (0,0) 变为 (1,1) ]。现在我们想要扩展它并将“放置”的纹理应用到每个表面的区域。
认为有可能直接将 uv 多边形绘制到模板缓冲区,甚至不知道等效的 xyz 多边形......然后所有现有代码都可以工作。也许可以使用像帧缓冲区对象这样的技巧,并对其进行模板多边形的初始绘制,然后在曲面网格的“真实”绘制期间将其用作模板。那会是一个好方法吗?或者,还有更好的方法?
欢迎任何建议或相关示例的 url 链接... PS 看过这些线程...有点相关,但我认为不是完全相同的问题...
我目前正在查看一些用于屏幕外阴影映射的工作 FBO 设置/使用代码,并试图使其适用于这种看似简单的情况。我不清楚的一点是需要设置 gl 调用......我对如何设置它感到很困惑。这是硬件阴影 FBO 设置的摘录,其中的位被切掉了??添加...任何关于正确顺序的帮助表示赞赏。
glBindTexture(GL_TEXTURE_2D, tex);
?? not
::glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, shadowsize, shadowsize, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
?? but a more normal binding approp to drawing RGBA textures
::glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_Framebuffer);
// Attach everything, tell fbo there will be a drawbuffer, unlike shadows tex draw
// ?? use GL_COLOR_ATTACHMENT0_EXT
glDrawBuffer(GL_NONE);
// no color buffer dest...
??wrong glReadBuffer(GL_NONE);
// no color buffer src
?? glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, tex, 0);
//??
注意:tex
, m_Frambuffer
are ints
, 正确分配了 textureid 和 framebuffer,认为那个位没问题。我的主要困惑是
- 似乎代码确实将 glBindTexture、glTexImage2D、glBindTexture 释放为 0:提前释放是否正确?
- 需要 glDrawBuffer + glReadBuffer 调用吗?