2013-05-19 25 views
7

Vấn đề:

tôi đang học OpenGL từ http://www.arcsynthesis.org/gltut/index.html hướng dẫn, và tôi đã có thời gian thực sự khó khăn nhận được Tutorial 13: kẻ mạo danh Geometry làm việc (hơn 6 giờ), và bây giờ là làm việc sau một sự thay đổi thực sự nhỏ trong mã thực sự là không có op, và tôi cần sự giúp đỡ của bạn để tìm hiểu tại sao nó thay đổi bất cứ điều gì.GLSL, giao diện khối

Giải thích - chỉnh sửa:

Vấn đề là với mã không thay đổi các shader mảnh đã không nhận được đầu vào đúng từ đổ bóng hình học, nhưng với một trong hai thay thế đổ bóng hình học của ra giao diện khối để biến tách hoặc đưa ra khối một tên dụ làm cho chương trình hoạt động tốt. Nhưng những thay đổi này sẽ là không-op.

Sự cố có thể là xung đột tên.

Như thế này nó không hoạt động:

in VertexData 
{ 
    vec3 cameraSpherePos; 
    float sphereRadius; 
} vert[]; 

out FragData 
{ 
    flat vec3 cameraSpherePos; 
    flat float sphereRadius; 
    smooth vec2 mapping; 
}; 

void main() 
{ 
    mapping = 
    cameraSpherePos = 
    sphereRadius = 
    EmitVertex(); 
    /* mapping's value doesn't get to the fragment shader correctly */ 
} 

Nhưng một trong hai cho FragData một tên ví dụ như frag, và sử dụng frag.mappaing instad lập bản đồ, hoặc sử dụng 3 biến riêng biệt giải quyết vấn đề.

Tại sao nó không hoạt động mà không có tên mẫu?

Chỉnh sửa: Có vẻ như đó là sự cố trình điều khiển.

+0

Bạn đang chạy phần cứng nào? –

+0

Chương trình đang chạy #verison 330 trên: Geforce GTS 360M - "3,30 NVIDIA qua trình biên dịch Cg" – IceCool

+0

Hm, thêm shader và C++ code sẽ giúp đưa ra câu trả lời chính xác hơn. Trong trình đổ bóng gs của bạn, bạn khởi tạo/thiết lập từng thành viên của FragData chính xác cho mỗi lần lặp đỉnh, trước khi gọi EmitVertex(). Ngoài ra nếu bạn có nhiều lời gọi - hãy đảm bảo bạn đã đặt FragData chính xác. – dinony

Trả lời

2

Tạo tên thể hiện cho tất cả các khối giao diện như:

FragData { // .. } gs2fs; 

Và sau đó:

gs2fs.cameraCornerPos = vec4(vert[0].cameraSpherePos, 1.0); 
2

Làm việc với các mẫu GLSL thường bị tẻ nhạt do các vấn đề về phiên bản khó chịu.

Một số lời khuyên gỡ lỗi chung:

  • xác minh rằng bạn đã bao gồm các thẻ phiên bản thích hợp trong nguồn đổ bóng của bạn
  • xác minh rằng điều khiển OpenGL của bạn thực sự hỗ trợ phiên bản bằng cách gọi glGetString(GL_SHADING_LANGUAGE_VERSION)
  • tạo phương tiện đổ bóng thời gian chạy -recompilation (ví dụ như bằng cách gán cho một sự kiện quan trọng)
  • và FOREMOST: sử dụng glGetShaderInfoLog()glGetProgramInfoLog()!
+0

Tôi đang sử dụng #version 330 cho chương trình của mình, được hỗ trợ bởi GPU của tôi. Thực ra tôi lập trình bằng C++ chứ không phải c, vì vậy tôi sử dụng tính năng nếu việc biên dịch/liên kết không thành công, một ngoại lệ sẽ được ném với thông điệp tường trình như what(). Điều này làm cho mã dễ đọc hơn một chút + Tôi không phải tạo một "char logbuffer [2000];" chỉ để có thể gọi hàm infolog. – IceCool

+0

Nhiều lớp trung gian sẽ không giúp bạn cách ly lỗi này, và tôi nghi ngờ rằng mọi người sẽ có xu hướng xây dựng khung làm việc dày như một khung công tác tuts này chỉ để giúp bạn. Vì vậy, hãy thử xây dựng một ví dụ MINIMAL sao chép "lỗi" giả định bằng cách sử dụng các biện pháp gỡ lỗi GLSL mà tôi đã nói với bạn. – Solkar

1

Vấn đề thực sự là với không sử dụng trình điều khiển mới nhất.

Tôi đã chạy ứng dụng này trên Linux và có trình điều khiển mới nhất từ ​​trình quản lý gói của Ubuntu: thử nghiệm Nvidia 310. Nhưng mặc dù thử nghiệm của nó, nó khá cũ. Với việc cài đặt thủ công 319 từ trang của nvidia, mã hoạt động tốt mà không có bất kỳ thay đổi nào.

đạo đức của câu chuyện:

Luôn luôn sử dụng các trình điều khiển mới nhất.