【发布时间】: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