2012-01-09 17 views
6

Tôi đang cố gắng để viết một hình học đơn giản shader những gì chỉ đi qua đỉnh trước khi cố gắng sửa đổi công cụ.GLSL 1.5 Hình học đơn giản shader

vertex của tôi là

#version 150 core 
in vec3 inPosition; 
in vec4 inColor; 

out vec4 vertexColor; 

void main() { 
    vertexColor = inColor; 
    gl_Position = vec4(inPosition, 1.0); 
} 

geometry shader của tôi là

#version 150 core 
layout (triangles) in; 
layout (triangle_strip, max_vertices=3) out; 

void main() { 
    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[1].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[2].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

Và shader mảnh của tôi là

#version 150 core 
in vec4 vertexColor; 
out vec4 fragColor; 

void main() { 
    fragColor = vertexColor; 
} 

Nếu không có sự đổ bóng hình học liên kết trong, mọi thứ đều hoạt động tốt. Tuy nhiên, khi tôi liên kết trong trình đổ bóng hình học, nó sẽ ngừng hoạt động. Tôi đang thiếu cái gì? Trình tạo hình học của tôi có yêu cầu đầu vào cho vertexColor từ trình đổ bóng đỉnh của tôi không và nếu được thực hiện thì sao?

+0

http://en.wikipedia.org/wiki/GLSL#A_sample_trivial_GLSL_geometry_shader? – n0rd

+0

Điều đó không trả lời được câu hỏi của tôi. Trình đổ bóng hình học của tôi chính xác giống như hình được liệt kê trên trang đó ngoại trừ vòng lặp for đã bị xóa. Tuy nhiên nó không hoạt động. Không có gì được rút ra. Ngoài ra các vertex và fragment shaders hiển thị trên trang đó là cho glsl 1.20 Có một vấn đề liên kết tất cả những điều này với nhau mà tôi không hiểu và tôi có thể tìm thấy bất kỳ thông tin nào về cách khắc phục. – user1139069

Trả lời

7

geometry shader của tôi là chính xác giống như một trong những liệt kê trên trang đó

Có, nhưng đỉnh và mảnh miễn phí của bạn shaders là không.

Thông tin chảy qua đường ống OpenGL như sau: Đầu tiên, trình đổ bóng đỉnh được nội dung. Nó chuyển kết quả đầu ra của nó đến trình đổ bóng hình học nếu có. Trình đổ bóng hình học chuyển các kết quả đầu ra của nó tới trình đổ bóng phân đoạn (sau khi rasteriation tam giác thông thường, tất nhiên). Và shader fragment chuyển các kết quả đầu ra của nó đến giai đoạn pha trộn.

Trình đổ bóng đỉnh của bạn có hai đầu ra: gl_PositionvertexColor. Trình tạo hình của bạn chỉ mất một đầu vào: gl_in[0].gl_Position. Điều này không hợp pháp trong GLSL: nếu một giai đoạn xuất ra một giá trị, bước tiếp theo là phải nhập giá trị đó. Ngoại lệ duy nhất là dành cho các giá trị được xác định GLSL như gl_Position, được sử dụng bởi trình quét.

GS truyền qua của bạn cần thực sự chuyển dữ liệu qua nếu bạn muốn thông qua. Bạn cần phải nhập dữ liệu thích hợp vào GS của mình:

in vec4 vertexColor[]; 

Tuy nhiên, các biến toàn cầu trong GLSL không thể được đặt tên giống nhau. Vì vậy, bạn không thể lấy vertexColor làm đầu vào làm đầu ra. Vì vậy, thay vào đó, bạn phải thay đổi tên của sản lượng (hoặc sử dụng interface blocks):

out vec4 gsColor; 

shader mảnh của bạn bây giờ phải mất in vec4 gsColor; và làm việc với điều đó.

Khi bạn cố gắng liên kết các trình đổ bóng này, trình biên dịch của bạn phải cung cấp cho bạn thông tin nhật ký thích hợp giải thích về sự không khớp. Bạn có nhận được thông tin-nhật ký của mình khi trình đổ bóng của bạn không liên kết được không? Nếu không, bạn nên.

+0

GsColor có cần phải là mảng hay không và nếu tôi đã thêm đỉnh, thì đầu ra gsColor có khớp với các đỉnh được thêm vào không? Nếu gsColor phải là một mảng giống như tôi đoán nó, các chỉ mục của mảng đó có khớp với thứ tự của các đỉnh mà tôi đang phát ra không? – user1139069

+0

'gl_Position' trong trình đổ bóng hình học cũng không phải là một mảng. Bạn viết mỗi đầu ra, sau đó gọi 'EmitVertex' để tạo ra tất cả các đầu ra đó. Bạn đặt 'gsColor' cho mỗi đỉnh bạn phát ra, giống như bạn đặt' gl_Position' cho mỗi đỉnh được phát ra. –

+0

Vì vậy, một cái gì đó như 'gl_Position = gl_in [0] .gl_Position; gsColor = vertexColor [0] EmitVertex(); gl_Position = gl_in [1] .gl_Position; gsColor = vertexColor [1] EmitVertex(); '? – user1139069