首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >圆柱上的纹理映射

圆柱上的纹理映射
EN

Stack Overflow用户
提问于 2012-08-14 09:48:55
回答 1查看 4.5K关注 0票数 3

我想把一个均匀的棋盘纹理应用到高度h的圆柱表面,和半半径(a,b)

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

顶点着色器:

代码语言:javascript
复制
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) );
}

片段着色器:

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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棋盘。现在我想要应用这个纹理来保持棋盘的均匀性(不加拉伸的方块),但是我只在曲面的较小的部分得到正确的高宽比,而在更弯曲的部分,瓷砖是拉伸的。

我想了解如何在不扭曲和拉伸纹理的情况下应用纹理,也许可以重复纹理,而不是拉伸纹理。

我也有一个奇怪的问题闪烁在纹理的边界上,在两个边界相交的地方,如何解决它(它可以在第二张图像中看到)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-14 13:42:15

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

因此,备选方案是:

  1. 量化采样,修改纹理坐标,以更好地适应非循环(动态,但质量低时,使用低聚泰塞拉;这是最简单的解决方案,但实现)。
  2. 使用片段着色器对纹理坐标进行非线性缩放(可能会更复杂一些,但动态的,并根据纹理大小、所使用的过滤和纹理contents(!))提供相当好的效果)。
  3. 修改纹理(静态解决方案-将只对给定的Ra/Rb比工作。然而,质量将是最好的)。

至于边框上的闪烁,您必须为您的纹理生成mipmap。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11949745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档