【问题标题】:how to rotate and translate rectangle texture in shader如何在着色器中旋转和平移矩形纹理
【发布时间】:2016-04-24 19:35:03
【问题描述】:

我正在尝试处理片段着色器中的纹理变换。 窗口分辨率为(640,360),旋转30度,比例为vec2(0.5,0.5)。

这就是我想要的: 这是我的片段着色器:

precision mediump float;                            
varying vec2 v_texCoord;                           
uniform sampler2D s_texture;                       
mat3 makeTranslation(vec2 t) {  
    mat3 m = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, t.x, t.y, 1.0);
    return m;
}   
mat3 makeRotation( float angleInRadians ){
    float c = cos(angleInRadians);
    float s = sin(angleInRadians);
    mat3 m = mat3(c, -s, 0, s, c, 0, 0, 0, 1);
    return m;
}
mat3 makeScale(vec2 s) {
   mat3 m = mat3( s.x, 0, 0, 0, s.y, 0, 0, 0, 1);
    return m;
}

void main(){
    vec2 position = vec2(0.0,0.0);  
    vec2 scale = vec2(0.5,0.5);  
    float rotation = 30.0;  
    float r = rotation/180.0*3.14159; 
    vec2 size = vec2(640.0,480.0);

    mat3 mt = makeTranslation( translation );
    mat3 mr = makeRotation( r ); 
    mat3 ms = makeScale( 1.0/scale ); 

    //transform
    vec3 newCoord = vec3(v_texCoord.xy,1.0);                
    newCoord = mt*newCoord; 
    newCoord = mr*ms*vec3(newCoord.x - 0.5, newCoord.y - 0.5,0.0) + vec3(0.5, 0.5, 0.0);

    gl_FragColor = texture2D(s_texture, vec2(newCoord.x, newCoord.y) ); 
} 

结果是:
可以看到,结果不正确。

所以,我将矩形大小的比例应用于 texcoord.y:

//transform
float fy = 0.5*(1.0 - size.y*1.0/size.x);
newCoord.y = (newCoord.y-0.5)*size.y/size.x+fy;
newCoord = mt*newCoord; \n"
newCoord = mr*ms*vec3(newCoord.x - 0.5, newCoord.y - 0.5,0.0) + vec3(0.5, 0.5, 0.0);
newCoord.y = (newCoord.y+0.5)*size.x/size.y-fy;

我有什么: 矩形是正确的,但是中心点的位置不对。

那么,如何得到正确的结果呢? 谢谢。

这里是原始纹理:

【问题讨论】:

  • 这是在片段着色器中而不是顶点着色器中的原因吗?
  • 实际上,如果我在 texcoord 上应用矩阵,它们具有相同的性能
  • 问题解决了吗?如果是肯定的,你能写出你是如何解决的吗?

标签: opengl shader


【解决方案1】:

获得正确的操作顺序非常重要

当您收到纹理坐标时,它们在 [0, 1] 范围内。但是,您需要先平移它们,使它们位于 [-0.5, 0.5] 中,然后再旋转它们,以便围绕纹理中心旋转。然后应用你的 scale,最后是你的 translation

【讨论】:

  • 感谢您的回复,您说得对,我应该将翻译应用到最后。但是在这种情况下,平移是 (0.0f, 0.0f),所以纹理的中心仍然在屏幕的中心,如您在第二张图像中所见。所以问题是如何将纹理从第二张图像变成第一张图像。 (矩形在第二张图片中失真)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2019-10-24
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多