Anonymous
Проблема с артефактами зеркального освещения в OpenGL
Сообщение
Anonymous » 23 янв 2025, 21:29
Проблема заключается именно в том, что я смотрю на углы комнаты. Когда я это сделаю, зеркальная молния станет ярче:
...и когда я смотрю на плоскую стену, нет:
Здесь я публикую весь код:
Код: Выделить всё
#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]
1737656953
Anonymous
Проблема заключается именно в том, что я смотрю на углы комнаты. Когда я это сделаю, зеркальная молния станет ярче: [img]https://i.sstatic.net/rU2Sqblk.png[/img] ...и когда я смотрю на плоскую стену, нет: [img]https://i.sstatic.net/mLhIN0mD.png[/img] Здесь я публикую весь код: [code]#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]