Отложенное затенение в OpenGL?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Отложенное затенение в OpenGL?

Сообщение Anonymous »

У меня возникла странная проблема с моей реализацией отложенного затенения.
Я передаю необходимую информацию через MRT в FBO, в настоящее время диффузное, положение и нормали в мировом пространстве, которое выглядит следующим образом:

Изображение


Это делается с помощью следующей настройки для все текстуры деревьев:

Код: Выделить всё

diffuse = std::shared_ptr(new bb::Texture(GL_TEXTURE_2D)); // generates texture ID
diffuse->bind();
diffuse->texture2D(0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, 0); // glTexture2D
diffuse->parameterf(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
diffuse->parameterf(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
diffuse->parameterf(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
diffuse->parameterf(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
diffuse->unbind();
texture2D(GL_COLOR_ATTACHMENT0+1, diffuse->getID(), 0);
Затем они используются на этапе рисования:

Код: Выделить всё

dsShader->bind();
dsShader->enableVertexAttribArrays();

ds->diffuse->bind(GL_TEXTURE0); // "ds" is an FBO containing the textures
ds->position->bind(GL_TEXTURE0+1);
ds->normal->bind(GL_TEXTURE0+2);

dsShader->sendUniform("diffuse", 0);
dsShader->sendUniform("position", 1);
dsShader->sendUniform("normal", 2);

dsShader->sendUniform("camera", camera3D->position.x, camera3D->position.y, camera3D->position.z);

dsOut->indexBuffer->bind();
dsOut->vertex2Buffer->bind();
dsOut->vertex2Buffer->vertexAttribPointer(dsShader->getAttribLocation("vertex0"), 2, GL_FLOAT, false, 0, 0);

glDrawElements(GL_TRIANGLES, dsOut->indexBuffer->size(), GL_UNSIGNED_INT, 0);

ds->diffuse->unbind();
ds->position->unbind();
ds->normal->unbind();

dsShader->disableVertexAttribArrays();
dsShader->unbind();
Со следующим шейдером (только необходимая часть, источник света жестко запрограммирован):

Код: Выделить всё

struct DirLight{
vec3 direction;
vec4 diffuse, specular;
};

uniform sampler2D diffuse;
uniform sampler2D position;
uniform sampler2D normal;

uniform vec3 camera;

DirLight light0 = DirLight(vec3(1, 1, 0), vec4(0.3), vec4(0.1));

in vec2 vertex;

void main(){
vec4 color = texture(diffuse, vertex)*0.5;
vec3 p = vec3(texture(position, vertex));
vec3 n = normalize(vec3(texture(normal, vertex)));

float ndotl = max(dot(n, normalize(light0.direction)), 0.0); // simple phong

if(ndotl > 0.0){
color += ndotl*light0.diffuse;
}

gl_FragColor = color;
}
Странная часть: если я установлю направление источника света на отрицательные значения, скажем:

Код: Выделить всё

DirLight light0 = DirLight(vec3(-1, 0, 0), vec4(0.3), vec4(0.1));
Окончательный результат не затеняется. Это выглядит правильно для положительных значений (более или менее).
Вот изображение вывода:

Изображение


И также может быть проблема с нормалями, отмеченными в красной области.

Подробнее здесь: https://stackoverflow.com/questions/228 ... -in-opengl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»