Проблема с артефактами зеркального освещения в OpenGLC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с артефактами зеркального освещения в OpenGL

Сообщение Anonymous »

Проблема заключается именно в том, что я смотрю на углы комнаты. Когда я это сделаю, зеркальная молния станет ярче:
Изображение

...и когда я смотрю на плоскую стену, нет:
Изображение

Здесь я публикую весь код:

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define GLEW_STATIC
#include 
#include 

template 
T clamp(T value, T min, T max) {
if (value < min) return min;
if (value > max) return max;
return value;
}

// CAMERA PROPERTIES
float posX = 0.0f, posY = 0.0f, posZ = 5.0f; // position
float rotX = 0.0f, rotY = 3.0f;              // rotation

// movement speed and mouse sensitivity
float speed = 0.05f;
const float mouseSensitivity = 0.005f;

// MOUSE INPUT TRACKING
double lastMouseX, lastMouseY;

// ROOM BOUNDARIES
float x_min = -5.0f, x_max = 5.0f;
float z_min = -5.0f, z_max = 5.0f;
float collision = 0.2f;

void checkCollision(float &posX, float &posZ) {
if (posX < x_min + collision) posX = x_min + collision; // left
if (posX > x_max - collision) posX = x_max - collision; // right
if (posZ < z_min + collision) posZ = z_min + collision; // back
if (posZ > z_max - collision) posZ = z_max - collision;  // front
}

void drawLightMarker() {
glDisable(GL_LIGHTING);
glColor3f(1.0f, 1.0f, 0.0f);
glPushMatrix();
glTranslatef(0.0f, 0.5f, 0.0f);

glBegin(GL_QUADS);

// FRONT FACE
glVertex3f(-0.1f, -0.1f, 0.1f);
glVertex3f(0.1f, -0.1f, 0.1f);
glVertex3f(0.1f, 0.1f, 0.1f);
glVertex3f(-0.1f, 0.1f, 0.1f);

// BACK FACE
glVertex3f(-0.1f, -0.1f, -0.1f);
glVertex3f(0.1f, -0.1f, -0.1f);
glVertex3f(0.1f, 0.1f, -0.1f);
glVertex3f(-0.1f, 0.1f, -0.1f);

// LEFT FACE
glVertex3f(-0.1f, -0.1f, -0.1f);
glVertex3f(-0.1f, -0.1f, 0.1f);
glVertex3f(-0.1f, 0.1f, 0.1f);
glVertex3f(-0.1f, 0.1f, -0.1f);

// RIGHT FACE
glVertex3f(0.1f, -0.1f, -0.1f);
glVertex3f(0.1f, -0.1f, 0.1f);
glVertex3f(0.1f, 0.1f, 0.1f);
glVertex3f(0.1f, 0.1f, -0.1f);

// TOP FACE
glVertex3f(-0.1f, 0.1f, 0.1f);
glVertex3f(0.1f, 0.1f, 0.1f);
glVertex3f(0.1f, 0.1f, 0.1f);
glVertex3f(-0.1f, 0.1f, 0.1f);

// BOTTOM FACE
glVertex3f(-0.1f, -0.1f, -0.1f);
glVertex3f(0.1f, -0.1f, -0.1f);
glVertex3f(0.1f, -0.1f, 0.1f);
glVertex3f(-0.1f, -0.1f, 0.1f);

glEnd();
glPopMatrix();
glEnable(GL_LIGHTING);
}

// ********TO FIX********
void setupLightning() {
// PROPERTIES
GLfloat ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat diffuse[] = {2.0f, 2.0f, 2.0f, 1.0f};
GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat mat_specular[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat shininess[] = {20.0f};

glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMaterialfv(GL_FRONT, GL_SHININESS, shininess);

// ATTENUATION
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.5f);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1f);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.01f);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_NORMALIZE);
}

void processInput(GLFWwindow *window) {
// FORWARD/BACKWARD MOVEMENT
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
posX += speed * sin(rotY);
posZ += speed * cos(rotY);
}

if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
posX -= speed * sin(rotY);
posZ -= speed * cos(rotY);
}

// LEFT/RIGHT STRAFING
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
posX += speed * cos(rotY);
posZ -= speed * sin(rotY);
}

if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
posX -= speed * cos(rotY);
posZ += speed * sin(rotY);
}

if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwDestroyWindow(window);
glfwTerminate();
}

if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) speed = 0.5f;

if (glfwGetKey(window, GLFW_KEY_BACKSPACE) == GLFW_PRESS) speed = 0.05f;
//checkCollision(posX, posZ);
}

void mouseCallback(GLFWwindow* window, double xpos, double ypos) {
// calculate mouse delta
double deltaX = xpos - lastMouseX;
double deltaY = ypos - lastMouseY;
lastMouseX = xpos;
lastMouseY = ypos;

// UPDATE ROTATION
rotY -= deltaX * mouseSensitivity; // Horizontal rotation
rotX -= deltaY * mouseSensitivity;  // Vertical rotation

rotX = clamp(rotX, -1.5f, 1.5f);
}

void renderRoom() {
glBegin(GL_QUADS);

// FLOOR
glColor3f(0.5f, 0.5f, 0.5f);
glNormal3f(0.0f, 1.0f, 0.0f);

glVertex3f(-5.0f, -1.0f, -5.0f);
glVertex3f(5.0f, -1.0f, -5.0f);
glVertex3f(5.0f, -1.0f, 5.0f);
glVertex3f(-5.0f, -1.0f, 5.0f);

// CEILING
glColor3f(0.3f, 0.3f, 0.3f);
glNormal3f(0.0f, -1.0f, 0.0f);

glVertex3f(-5.0f, 1.0f, -5.0f);
glVertex3f(5.0f, 1.0f, -5.0f);
glVertex3f(5.0f, 1.0f, 5.0f);
glVertex3f(-5.0f, 1.0f, 5.0f);

// WALLS

// back wall
glColor3f(0.8f, 0.2f, 0.2f);
glNormal3f(0.0f, 0.0f, 1.0f);
glVertex3f(-5.0f, -1.0f, -5.0f);
glVertex3f(5.0f, -1.0f, -5.0f);
glVertex3f(5.0f, 1.0f, -5.0f);
glVertex3f(-5.0f, 1.0f, -5.0f);

// front wall
glNormal3f(0.0f, 0.0f, -1.0f);
glVertex3f(-5.0f, -1.0f, 5.0f);
glVertex3f(5.0f, -1.0f, 5.0f);
glVertex3f(5.0f, 1.0f, 5.0f);
glVertex3f(-5.0f, 1.0f, 5.0f);

// left wall
glNormal3f(1.0f, 0.0f, 0.0f);
glVertex3f(-5.0f, -1.0f, -5.0f);
glVertex3f(-5.0f, -1.0f, 5.0f);
glVertex3f(-5.0f, 1.0f, 5.0f);
glVertex3f(-5.0f, 1.0f, -5.0f);

// right wall
glNormal3f(-1.0f, 0.0f, 0.0f);
glVertex3f(5.0f, -1.0f, -5.0f);
glVertex3f(5.0f, -1.0f, 5.0f);
glVertex3f(5.0f, 1.0f, 5.0f);
glVertex3f(5.0f, 1.0f, -5.0f);

glEnd();
}

GLFWwindow* initWindowFullScreen() {
// INITIALIZE GLFW
if (!glfwInit()) std::cerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/79382179/problem-with-specular-lightning-artifacts-in-opengl[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблема с артефактами зеркального освещения в OpenGL
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как правильно оформить прозрачность поверхности трехмерного объекта с помощью освещения с помощью OpenGL
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Текстура BRDF со странными артефактами
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Эмулятор Android показывает глючный экран со странными артефактами
    Anonymous » » в форуме Android
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Переворачивание изображения для получения зеркального эффекта
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

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