c++ - 圆柱体上的纹理映射

标签 c++ opengl glsl textures texture-mapping

我想将均匀的棋盘纹理应用到高度 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 的棋盘格。现在我希望应用纹理以保持棋盘均匀(没有拉伸(stretch)的正方形),但我只在表面的较少弯曲部分获得正确的纵横比,而在更弯曲的部分,瓷砖被拉伸(stretch)。

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

In the first image the tiles on the less curved part are square

while where the curvature is higher they are more stretched

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

最佳答案

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

所以,选项是:

  1. 量化采样,修改纹理坐标以更好地适应非圆形(动态,但使用低多边形曲面 segmentation 时质量较低;尽管这是最简单的实现解决方案)。
  2. 使用片段着色器以非线性方式缩放纹理坐标(可能有点复杂,但动态且提供相当不错的结果,具体取决于纹理大小、使用的过滤和纹理内容(!))
  3. 修改纹理(静态解决方案 - 仅适用于给定的 Ra/Rb 比率。但是,质量将是最好的)。

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

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

关于c++ - 圆柱体上的纹理映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11949745/

相关文章:

opengl - 使用 OpenGL 绘制图 block 的技术

c++ - 如何为 2D 和 3D 调整顶点着色器?

c++ - 初始化标准流对象

c++ - 切换 C++ 函数的调用堆栈

opengl - 现代 GLSL 中的每像素光照?

c++ - 奇怪的访问冲突读取错误/glDrawArrays 使用

c++ - d3dx12.h 给出了一堆错误

c++ - 我的代码停止读取我的 .txt 文件

geometry - 如何将着色器转换为 azimuthal_equidistant

c++ - 片段着色器莫名其妙的行为