Làm cách nào để thiết lập sương mù để theo tọa độ người chơi?


7

Tôi tự hỏi liệu có thể thiết lập sương mù theo tọa độ của người chơi không (nơi có sương mù bao quanh người chơi để biến nó thành người thứ ba hơn) lý do chính khiến tôi hỏi điều này là vì tôi có người chơi của mình hướng về góc trên bên phải của màn hình

Đây là một số mã có thể cung cấp cho bạn một hướng dẫn về những gì tôi đang làm:

glEnable(GL_FOG) GLfloat FogColor[] = {0.8,0.8,0.8,1.0};
glFogfv(GL_FOG_COLOR,FogColor);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogf(GL_FOG_START,30);
glFogf(GL_FOG_END,);
glHint(GL_FOG_HINT,GL_NICEST);

và tôi muốn sương mù đi theo một cầu thủ có vị trí như đã nói trong

posX,posY,posZ

Nếu bất cứ ai cũng có thể biến mã này thành một số mã ví dụ sẽ rất hữu ích, cảm ơn

Nếu điều này là không thể thì làm cách nào tôi thiết lập sương mù ở xung quanh một vị trí nhất định của máy ảnh, như hiển thị ở góc trên cùng bên phải của máy ảnh thay vì ở giữa?

Đây là hình ảnh của màn hình trò chơi để bạn có thể thấy những gì tôi đang nói về:

nhập mô tả hình ảnh ở đây

Câu trả lời:


1

Tôi nghĩ rằng điều này sẽ được thực hiện dễ dàng nhất bằng cách sử dụng shader. Nếu bạn chưa có khả năng sử dụng shader, tôi khuyên bạn nên tìm hiểu chúng bất kể vì chúng siêu hữu ích cho nhiều thứ như thế này. Hoạt động theo giả định bạn có thể sử dụng chúng, đây là một shader đỉnh và mảnh sẽ tạo ra sương mù bán kính màu xám xung quanh vị trí của nhân vật của bạn (với kết cấu đơn giản).

Vertex Shader (Fog.vert):

uniform vec3 playerPos;
uniform sampler2D colorMap;

varying vec3 vertexToPlayer;

void main(void)
{
    vec3 vertexPos = vec3(gl_Vertex[0], gl_Vertex[1], gl_Vertex[2]);

    vertexToPlayer = playerPos - vertexPos;

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Mảnh vỡ mảnh (Fog.frag):

uniform vec3 playerPos;
uniform sampler2D colorMap;

varying vec3 vertexToPlayer;

void main(void)
{
    const float radius = 1024.0;

    float dist = length(vertexToPlayer);
    float attenuation = clamp((radius - dist) / radius, 0.0, 1.0);

    vec4 diffuseTexel = texture2D(colorMap, gl_TexCoord[0].st);
    vec4 diffuseTerm  = diffuseTexel * attenuation + (.8 * (1.0-attenuation));
    diffuseTerm.a = diffuseTexel.a; /* preserve alpha */

    gl_FragColor = diffuseTerm;
}

Sau đó, ở đâu đó trong mã của bạn, chuyển các giá trị của bạn cho vị trí người chơi bằng:

GLint playerPos = glGetUniformLocation(prog, "playerPos");
glUniform3f(playerPos, xPos, yPos, zPos);

Hy vọng điều này là hữu ích!


+1. Đây là cách tốt nhất để làm điều đó. Shader cai trị! (Aaand là tất cả những gì bạn có thể hy vọng trong tương lai và trên thiết bị di động ...)
Macke

0

Sử dụng tọa độ sương mù. http://www.opengl.org/regology/doc/fog_coord.txt

Thông thường, giá trị sương mù được tính bằng cách sử dụng hệ số khoảng cách từ mắt đến pixel 'c'. Trong thực tế, mật độ sương mù là một hàm của khoảng cách.

f = exp (-d * c) - GL_EXP2
f = exp (- (d * c) ^ 2) - GL_EXP
f = (ec) / (es) - GL_LINEAR

Các tọa độ sương mù cho phép bạn đặt giá trị 'c' của phương trình và chỉ định các giá trị trực tiếp cho điều này. Nếu bạn muốn thiết lập sương mù sao cho 0 -> không có sương mù, 1.0 -> hầu hết sương mù, thì hãy làm:

glFogi (GL_FOG_MODE, GL_LINEAR);
glFogf (GL_FOG_START, 0,0f);
glFogf (GL_FOG_END, 1.0f);

// Điều này thực sự cho phép chế độ "sương mù tọa độ"
glFogi (FOG_COORDINATE_SOURCE_EXT, FOG_COORDINATE_EXT);

Sau đó, khi bạn kết xuất người của mình, hãy sử dụng glFogCoordfEXT ()

// Hiển thị sương mù (một số giá trị trong khoảng 0,0 - 1,0f)
glFogCoordfEXT (1.0f);

renderPerson ();

//Không có sương mù
glFogCoordfEXT (0,0f);

Chỉnh sửa: Một giải pháp thay thế mở rộng là vô hiệu hóa sương mù khi kết xuất mọi thứ, sau đó bật sương mù với khoảng cách bắt đầu / kết thúc phù hợp khi kết xuất nhân vật của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.