Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ 圆柱体上的纹理映射_C++_Opengl_Glsl_Textures_Texture Mapping - Fatal编程技术网

C++ 圆柱体上的纹理映射

C++ 圆柱体上的纹理映射,c++,opengl,glsl,textures,texture-mapping,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

我想对高度
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棋盘。现在,我希望应用纹理以保持棋盘格的一致性(没有拉伸的正方形),但我仅在曲面的不太弯曲的部分获得正确的纵横比,而在更弯曲的部分,瓷砖被拉伸

我想了解如何在不扭曲和拉伸纹理的情况下应用纹理,可能是通过重复纹理而不是拉伸纹理


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

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

因此,选择是:

  • 量化采样,修改纹理坐标以更好地适应非圆性(动态,但使用低多边形细分时质量较低;不过,这是实现的最简单解决方案)
  • 使用片段着色器非线性缩放纹理坐标(可能有点复杂,但动态,并提供相当好的结果,具体取决于纹理大小、使用的过滤和纹理内容(
  • 修改纹理(静态解决方案-仅适用于给定的Ra/Rb比率。但是,质量将尽可能最好)
  • 至于边界上的闪烁,您必须为纹理生成mipmap


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

    我不清楚你的问题是什么,你说正方形不是“正方形”,但这是你用透视图从一个角度看东西时所期望的,除非我误解了你的问题。不,透视图在这里只是显示物体的形状。我要问的是,为了防止椭圆边界上的瓷砖拉伸,我应该使用什么样的纹理坐标函数。我是否应该修改纹理本身?是否尝试将纹理映射为从摄影机投影到对象上的纹理?如何使用片段着色器修改纹理坐标?我是否应该直接在纹理坐标上操作,修改其
    s
    组件而保持
    t
    完好无损?我曾尝试在GIMP中找到一种使纹理变形的方法,但我找不到一种简单的方法,是否有一些插件可用于这类事情?那地图呢?我正在使用
    gluBuild2DMipmaps
    但是我仍然有闪烁的效果。如何修改它们?对它们应用一些非线性函数,所以是的,修改
    s
    ,但从片段着色器进行修改。嗯,我从来没有使用过
    gluBuild2DMipmaps
    。红皮书中有一种方法可以识别它们是否正确初始化。如果您不确定它们是否正确初始化,我想您可以试试这个。至于修改纹理-这当然不容易,可能需要一些3D工具,而不是纯粹的2D。我正在尝试实现碎片着色器解决方案,我正在寻找一个关于如何使用纹理变形着色器的教程。啊,好吧,很简单,我了解如何在u上操作,v纹理坐标直接…例如:
    gl\u FragColor=texture2D(我的颜色纹理,vec2(asin(纹理坐标.x),纹理坐标.y))完全正确;)我以为你马上就知道了。很好,它起作用了