Я хочу «портировать» одну «программу 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 () проблем нет.
Я хочу добавить пользовательский атрибут в вершину или изменить встроенные атрибуты. (или встроенные однородные значения).
, пожалуйста, помогите мне!