【问题标题】:Texture mapping on a cylinder圆柱体上的纹理映射
【发布时间】:2012-08-14 21:42:15
【问题描述】:

我想对高度为h、半半径为(a,b) 的圆柱表面应用统一的棋盘格纹理。

我已经实现了这个着色器:

顶点着色器:

varying vec2 texture_coordinate;
float twopi = 6.283185307;
float pi=3.141592654;

float ra = 1.5;
float rb= 1.0;

void main()
{
// Transforming The Vertex
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// -pi/2 < theta < pi/2
float theta =  (atan2( rb*gl_Vertex.y , ra*gl_Vertex.x)+pi*0.5)/pi;

// Passing The Texture Coordinate Of Texture Unit 0 To The Fragment Shader
    texture_coordinate = vec2(  theta , -(-gl_Vertex.z+0.5) );
}

片段着色器:

varying vec2 texture_coordinate;
uniform sampler2D my_color_texture;
void main()
{
    // Sampling The Texture And Passing It To The Frame Buffer
    gl_FragColor = texture2D(my_color_texture, texture_coordinate);
}

在客户端,我指定了以下选项:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

我的纹理是 3768x1200 棋盘格。现在我希望应用纹理以保持棋盘格均匀(没有拉伸的正方形),但我仅在曲面的较少弯曲部分获得正确的纵横比,而在弯曲较多的部分,瓷砖被拉伸。

我想了解如何应用纹理而不扭曲和拉伸它,也许是通过重复纹理而不是拉伸它。

我还有一个贴图边框奇怪闪烁的问题,两个边框相交的地方,怎么解决(可以看第二张图)?

【问题讨论】:

  • 我不清楚您的问题是什么,您说正方形不是“正方形”,但是当您以透视图的角度查看某些东西时,这是您所期望的,除非我误解了你的问题。
  • 没有透视图只是为了显示物体的形状。我要问的是我应该使用什么样的纹理坐标函数来防止椭圆边界上​​的瓷砖拉伸。我应该修改纹理本身吗?
  • 您是否尝试像从相机投影到对象一样映射纹理?

标签: c++ opengl glsl textures texture-mapping


【解决方案1】:

您可以修改纹理坐标以将其在对象上“缩小”一点。你不能做的是将纹理坐标参数化为非线性缩放。

所以,选项是:

  1. 量化采样,修改纹理坐标以更好地适应非圆形(动态,但使用低多边形镶嵌时质量较低;但这是最简单的解决方案)。李>
  2. 使用片段着色器以非线性方式缩放纹理坐标(可能更复杂,但动态且效果非常好,具体取决于纹理大小、使用的过滤和纹理内容(!强>))
  3. 修改纹理(静态解决方案 - 仅适用于给定的 Ra/Rb 比率。但是,质量将是最好的)。

至于边界上的闪烁,你必须为你的纹理生成mipmaps。

如果您需要更多信息,请告诉我。

【讨论】:

  • 如何使用片段着色器修改纹理坐标?我是否应该直接对 texture_coordinate 进行操作以修改其 s 组件而使 t 保持不变?我试图在 GIMP 中找到一种使纹理变形的方法,但我找不到一种简单的方法来做到这一点,是否有一些插件可用于这种事情?那么 mipmap 呢?我正在使用gluBuild2DMipmaps,但我仍然有那种闪烁的效果。
  • 如何修改它们?对它们应用一些非线性函数,所以是的,修改s,但是从片段着色器中进行。嗯,我从来没有用过gluBuild2DMipmaps。红皮书中有一种方法可以识别它们是否正确初始化。如果您不确定它们是否已正确初始化,我认为您可以尝试一下。至于修改纹理 - 这肯定不容易,可能需要一些 3D 工具而不是纯粹的 2D。
  • 我正在尝试实现片段着色器解决方案,我正在寻找有关如何进行纹理变形着色器的教程。
  • 啊好吧,很简单,我已经了解了如何直接对u,v纹理坐标进行操作...例如:gl_FragColor = texture2D(my_color_texture, vec2(asin(texture_coordinate.x),texture_coordinate.y) );
  • 完全正确 ;) 好吧,我以为你马上就知道了。很好,它正在工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多