OpenGL ES 2.0, определяющий нормали для вершинного шейдера

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

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

Думаю, проблема в нормалях, но я пробовал с ними почти все, но эффект не изменился.

//normal matrix and vertex matrix are same

static const float normals[]=

    {
         //v0,v1,v2,v3,
         //v4,v5,v6,v7
        0.5,0.5,0.5, -0.5,0.5,0.5, -0.5,-0.5,0.5, 0.5,-0.5,0.5, 

        0.5,0.5,-0.5, -0.5,0.5,-0.5, -0.5,-0.5,-0.5, 0.5,-0.5,-0.5 

    };

//vertex shader

attribute vec4 color;
attribute vec4 position; 

attribute vec4 normal;

uniform mat4 u_mvpMatrix;
uniform vec4 lightDirection;
uniform vec4 lightDiffuseColor;
uniform float translate;

varying vec4 frontColor;



//varying vec4 colorVarying;



void main()

{

   vec4 normalizedNormal = normalize(u_mvpMatrix* normal);
   vec4 normalizedLightDirection = normalize(lightDirection);

   float nDotL = max(dot(normalizedNormal, normalizedLightDirection), 0.0);


   frontColor =  color * nDotL * lightDiffuseColor;


  gl_Position = u_mvpMatrix * position;


}

//fragment shader

varying lowp vec4 frontColor;

void main()
{


        gl_FragColor = frontColor;


}

Пожалуйста помоги? Заранее спасибо !!


person CrazyESbeginner    schedule 03.06.2011    source источник
comment
Вы знаете, что вам не нужно отвечать на свой вопрос, чтобы его уточнить. Я случайно наткнулся на ваш ответ. Если вы хотите обсудить данный ответ, вы должны «добавить комментарий»; таким образом автор получает уведомление и может ответить. Затем для материала нового вопроса обычно редактируется исходный вопрос, чтобы добавить дополнительную информацию.   -  person rotoglup    schedule 07.06.2011
comment
Судя по всему, ваш ответ был удален, было бы полезно, если бы вы разместили снимок экрана с вашей проблемой.   -  person rotoglup    schedule 07.06.2011


Ответы (1)


Ваша проблема не связана с вашей нормальной матрицей, она связана с вашими входными нормалями.

Из того, что я читал, вы предоставляете 8 нормалей, по одной для каждой вершины, что означает, что вы предоставляете предварительно усредненные нормали; ваш вершинный шейдер не может их не усреднить.

Чтобы иметь надлежащие неоднородности в освещении, вам нужны прерывистые нормали: для каждого квадрата у вас есть 4 вершины, каждая из которых имеет нормаль, совпадающую с нормалью квадрата. Таким образом, вы получите 6x4 = 24 нормали (то есть столько же вершин).

Вы можете взглянуть на это для более подробного объяснения: http://www.songho.ca/opengl/gl_vertexarray.html

person rotoglup    schedule 04.06.2011