Как я могу добавить пользовательский атрибут для GLSL в Unity Shader? - PullRequest
0 голосов
/ 25 января 2019

Я хочу «портировать» одну «программу OpenGL в окне» на Unity.но я обнаружил, что единство не поддерживает пользовательский атрибут вершины и просто встроено.как это сделать?

моя цель проста.просто обычный шейдер, использующий модель подсветки фонга.я хочу сделать только пол (плоскость) и 2 света.

Переменной для расчетного цвета является окружающий цвет, излучающий цвет, диффузный цвет, положение света и вершины, зеркальный цвет, нормаль вершины, ModelViewMatrix.

Сначала я создаю плоский объект из редактора единиц и добавляю свой шейдер.но нет света.

Я думаю, что встроенные переменные единицы, единообразная переменная и атрибут не одинаковы в оконной программе.но я не знаю, как сделать то же самое.

(я установил камеру в том же положении и под тем же углом, но матрица вида оконной программы и единица cam.worldToCameraMatrix отличаются.)

, чем япопробуйте GL calss и нарисуйте плоскость self в OnPostRender ().но некоторые проблемы, я не могу установить нормальный вектор в вершине ... как добавить пользовательский атрибут в вершине?встроенный атрибут gl_Normal равен просто (0,0,0).я не хочу этого.

это мой шейдер.

Shader "GLSL/Phong"
{
    SubShader{
         Pass {
            GLSLPROGRAM

            uniform mat3 u_ModelViewMatrixInvTrans;

            #ifdef VERTEX

            varying vec3 v_position_EC;
            varying vec3 v_normal_EC;

            void main()
            {
                v_position_EC = vec3(gl_ModelViewMatrix*gl_Vertex);
                v_normal_EC = normalize(u_ModelViewMatrixInvTrans*gl_Normal);

                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
            }

            #endif

            #ifdef FRAGMENT
            varying vec3 v_position_EC;
            varying vec3 v_normal_EC;

            struct LIGHT {
                vec4 position; // assume point or direction in EC in this example shader
                vec4 ambient_color, diffuse_color, specular_color;
                vec4 light_attenuation_factors; // compute this effect only if .w != 0.0f
                vec3 spot_direction;
                float spot_exponent;
                float spot_cutoff_angle;
                int light_on;
            };

            struct MATERIAL {
                vec4 ambient_color;
                vec4 diffuse_color;
                vec4 specular_color;
                vec4 emissive_color;
                float specular_exponent;
            };

            uniform vec4 u_global_ambient_color;
            #define NUMBER_OF_LIGHTS_SUPPORTED 4
            uniform LIGHT u_light[4];
            uniform MATERIAL u_material;
            uniform int test;

            const float zero_f = 0.0f;
            const float one_f = 1.0f;

            vec4 lighting_equation(in vec3 P_EC, in vec3 N_EC) {
                vec4 color_sum;
                float local_scale_factor, tmp_float;
                vec3 L_EC;

                color_sum = u_material.emissive_color + u_global_ambient_color * u_material.ambient_color;

                for (int i = 0; i < NUMBER_OF_LIGHTS_SUPPORTED; i++) {
                    if (u_light[i].light_on == 0) continue;
                    local_scale_factor = one_f;
                    if (u_light[i].position.w != zero_f) { // point light source
                        L_EC = u_light[i].position.xyz - P_EC.xyz;

                        if (u_light[i].light_attenuation_factors.w != zero_f) {//빛의 감쇠 효과
                            vec4 tmp_vec4;

                            tmp_vec4.x = one_f;
                            tmp_vec4.z = dot(L_EC, L_EC);
                            tmp_vec4.y = sqrt(tmp_vec4.z);
                            tmp_vec4.w = zero_f;
                            local_scale_factor = one_f / dot(tmp_vec4, u_light[i].light_attenuation_factors);
                        }

                        L_EC = normalize(L_EC);

                        if (u_light[i].spot_cutoff_angle < 180.0f) { // [0.0f, 90.0f] or 180.0f.
                            float spot_cutoff_angle = clamp(u_light[i].spot_cutoff_angle, zero_f, 90.0f);
                            vec3 spot_dir = normalize(u_light[i].spot_direction);

                            tmp_float = dot(-L_EC, spot_dir);
                            if (tmp_float >= cos(radians(spot_cutoff_angle))) {
                                tmp_float = pow(tmp_float, u_light[i].spot_exponent);
                            }
                            else
                                tmp_float = zero_f;
                            local_scale_factor *= tmp_float;
                        }
                    }
                    else {  // directional light source
                        L_EC = normalize(u_light[i].position.xyz);
                    }

                    if (local_scale_factor > zero_f) {
                        vec4 local_color_sum = u_light[i].ambient_color * u_material.ambient_color;

                        tmp_float = dot(N_EC, L_EC);
                        if (tmp_float > zero_f) {
                            local_color_sum += u_light[i].diffuse_color*u_material.diffuse_color*tmp_float;

                            vec3 H_EC = normalize(L_EC - normalize(P_EC));
                            tmp_float = dot(N_EC, H_EC);
                            if (tmp_float > zero_f) {
                                local_color_sum += u_light[i].specular_color
                                    *u_material.specular_color*pow(tmp_float, u_material.specular_exponent);
                            }
                        }
                        color_sum += local_scale_factor * local_color_sum;
                    }
                }
                return color_sum;
            }

            void main(void) {
                gl_FragColor = lighting_equation(v_position_EC, normalize(v_normal_EC)); // for normal rendering
            }

            #endif

            ENDGLSL
         }
    }
}

Я считаю, что все свойства (равномерная переменная) установлены идеально.Оконная программа отлично работает.чем у lighting_equation () проблем нет.

Я хочу добавить пользовательский атрибут в вершину или изменить встроенные атрибуты. (или встроенные однородные значения).

, пожалуйста, помогите мне!

...