簡體   English   中英

使用GLSL着色器將X,Z坐標轉換為RGB

[英]Converting X, Z coords to RGB using GLSL shaders

我有一個三js場景,其中包含一個以原點為中心的100x100平面(即,最小坐標:(-50,-50),最大坐標:(50,50))。 我試圖通過在自定義glsl着色器中使用x和z坐標將平面顯示為色輪。 使用本指南 (請參閱極坐標中的HSB,朝頁面底部),我已經使用Three.js場景獲取着色器代碼,但這並不完全正確。

我已經對所有對我有意義的變量進行了調整,但是正如您在屏幕截圖中所看到的,顏色變化的頻率是其應有的兩倍。 我的數學直覺是將角度除以2,但是當我嘗試將其完全錯誤時。

我知道解決方案非常簡單,但是我已經嘗試了幾個小時,但還沒有。

如何將我目前擁有的着色器變成一種可以2pi弧度精確旋轉1次全彩色的着色器?

編輯:這是純文本格式的相關着色器代碼

varying vec3 vColor;
                const float PI = 3.1415926535897932384626433832795;
                uniform float delta;
                uniform float scale;
                uniform float size;

                vec3 hsb2rgb( in vec3 c ){
                    vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0),
                                             6.0)-3.0)-1.0,
                                     0.0,
                                     1.0 );
                    rgb = rgb*rgb*(3.0-2.0*rgb);
                    return c.z * mix( vec3(1.0), rgb, c.y);
                }

                void main()
                {
                    vec4 worldPosition = modelMatrix * vec4(position, 1.0);
                    float r = 0.875;
                    float g = 0.875;
                    float b = 0.875;
                    if (worldPosition.y > 0.06 || worldPosition.y < -0.06) {
                        vec2 toCenter = vec2(0.5) - vec2((worldPosition.z+50.0)/100.0, (worldPosition.x+50.0)/100.0);
                        float angle = atan(worldPosition.z/worldPosition.x);
                        float radius = length(toCenter) * 2.0;
                        vColor = hsb2rgb(vec3((angle/(PI))+0.5,radius,1.0));
                    } else {
                        vColor = vec3(r,g,b);
                    }
                    vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
                    gl_PointSize = size * (scale/length(mvPosition.xyz));
                    gl_Position = projectionMatrix * mvPosition;
                }

我發現我遵循的指南不正確。 我沒有正確考慮數學,但現在知道了問題所在。

atan的范圍是-PI / 2到PI / 2,僅占一個半圈。 worldPosition.x為負數時,atan將不會返回正確的角度,因為它超出了函數范圍。 需要根據平面中的象限調整角度。

Q1:什么都不做Q2:將PI添加到角度Q3:將PI添加到角度Q4:將2PI添加到角度

之后,將角度歸一化(除以2PI),然后將其傳遞給hsb2rgb函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM