Tôi có một chương trình tạo bản đồ chiều cao và sau đó hiển thị nó dưới dạng lưới với OpenGL. Khi tôi cố gắng để thêm ánh sáng, nó kết thúc với hình dạng vuông lạ bao gồm lưới. Họ là đáng chú ý hơn ở một số khu vực hơn những người khác, nhưng luôn luôn ở đó.Các đồ tạo tác ánh sáng vuông lạ trong OpenGL
Tôi đã sử dụng lưới tứ giác, nhưng không có gì thay đổi sau khi chuyển sang lưới tam giác. Tôi đã sử dụng ít nhất ba phương pháp khác nhau để tính toán các chỉ tiêu đỉnh, tất cả đều có cùng tác dụng. Tôi đã thực hiện ánh sáng theo cách thủ công bằng các trình đổ bóng, nhưng không có gì thay đổi khi sử dụng hệ thống chiếu sáng OpenGL được tích hợp sẵn.
mã bình thường-tạo mới nhất của tôi (đang phải đối mặt là một mảng của các chỉ số thành Verts, mảng đỉnh):
int i;
for (i = 0; i < NINDEX; i += 3) {
vec v[3];
v[0] = verts[faces[i + 0]];
v[1] = verts[faces[i + 1]];
v[2] = verts[faces[i + 2]];
vec v1 = vec_sub(v[1], v[0]);
vec v2 = vec_sub(v[2], v[0]);
vec n = vec_norm(vec_cross(v2, v1));
norms[faces[i + 0]] = vec_add(norms[faces[i + 0]], n);
norms[faces[i + 1]] = vec_add(norms[faces[i + 1]], n);
norms[faces[i + 2]] = vec_add(norms[faces[i + 2]], n);
}
for (i = 0; i < NVERTS; i++) {
norms[i] = vec_norm(norms[i]);
}
Mặc dù đó không phải là mã duy nhất mà tôi đã sử dụng, vì vậy tôi nghi ngờ rằng nó là nguyên nhân của vấn đề.
tôi vẽ lưới với:
Và tôi hiện không sử dụng bất kỳ shaders.
Điều gì có thể gây ra điều này?
EDIT: Một tập hợp toàn diện hơn về ảnh chụp màn hình:
Đối với người cuối cùng, mã shader là
Vertex:
varying vec3 lightvec, normal;
void main() {
vec3 lightpos = vec3(0, 0, 100);
vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex);
normal = gl_NormalMatrix * gl_Normal;
lightvec = normalize(lightpos - v);
gl_Position = ftransform();
}
Fragment:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}
Bạn có thể đăng hai ảnh chụp màn hình của cùng một cảnh, một ảnh có khung dây và một ảnh không có khung hình không? –
Có phải 'chỉ số' không được khởi tạo không? Bạn đang tích lũy các vectơ của bạn vào nó mà không cần zeroing nó trước, mặc dù nếu nó được zeroed ở nơi khác trong chương trình mà không phải là một vấn đề. – genpfault
bạn có đang sử dụng nội suy trơn cho các thuộc tính bình thường trong trình đổ bóng không? Có thể chuyển sang 'phẳng' một chút có thể giúp bản địa hóa vấn đề. Ngoài ra, ánh sáng OpenGL có xu hướng rất khó khăn đối với tôi - tôi thường chắc chắn hơn về mã tôi đã tự viết. –