程序纹理棋盘OpenGL

时间:2016-03-07 16:56:17

标签: c++ opengl shader

我遇到一些难以实现棋盘的程序纹理。这是我需要得到的:

enter image description here

这是我得到的:

enter image description here

它很接近但我的纹理在我需要的方面有所旋转。

以下是我的着色器的代码:

#version 330

in vec2 uv;

out vec3 color;

uniform sampler1D colormap;

void main() {
    float sx = sin(10*3.14*uv.x)/2 + 0.5;

    float sy = sin(10*3.14*uv.y)/2 + 0.5;

    float s = (sx + sy)/2;


    if(true){
            color = texture(colormap,s).rgb;
     }

colormap是从0到1的映射,其中0对应于红色,1对应于绿色。

我认为问题来自我使用的公式,(sx + sy)/ 2。我需要让方块不旋转但与大方块的边框对齐。 如果有人有想法得到好的公式。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以向" uv":

添加旋转操作
mat2 R(float degrees){
    mat2 R = mat2(1);
    float alpha = radians(degrees);
    R[0][0] =  cos(alpha);
    R[0][1] =  sin(alpha);
    R[1][0] = -sin(alpha);
    R[1][1] =  cos(alpha);
    return R;
}

void main(){
    ver2 new_uv = R(45) * uv;
    float sx = sin(10*3.14*new_uv.x)/2 + 0.5;
    float sy = sin(10*3.14*new_uv.y)/2 + 0.5;
    float s = (sx + sy)/2;
    color = texture(colormap,s).rgb;
}

答案 1 :(得分:0)

也许是这样的:

float sx = sin(10.0 * M_PI * uv.x);
float sy = sin(10.0 * M_PI * uv.y);
float s = sx * sy / 2.0 + 0.5;

示例(没有纹理): https://www.shadertoy.com/view/4sdSzn