GLSL - Viết lại các shader từ # 330 đến # 130


7

Gần đây tôi đã tạo ra một trò chơi ( LD21 ) sử dụng trình tạo bóng hình học để chuyển đổi các điểm thành các hình tam giác / kết cấu. Vì tôi có ấn tượng rằng sự hỗ trợ cho # 330 là phổ biến, tôi chỉ viết các shader # 330, nhưng có vẻ như rất nhiều phần cứng không quá cũ chỉ hỗ trợ # 130 (theo GLView)

Bây giờ, vì tôi chỉ quen với chức năng lõi # 330, tôi gặp khó khăn khi viết lại các shader của mình thành # 130. Trình tạo bóng mảnh vỡ khá đơn giản để viết lại, nhưng tôi chỉ xoay sở để đưa đỉnh của nó và trình đổ bóng hình học xuống # 150.

Vì vậy, nó có thể viết lại các shader hay nó sẽ đòi hỏi nhiều thay đổi trong công cụ kết xuất của tôi?

Shader hình học

#version 150
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
uniform mat4 oMatrix;
in VertexData
{
    vec4 position;
    vec4 texcoord;
    vec4 size;
} vert;

out vec2 gTexCoord;

void main()
{
    if(vert.position.x>-4f && vert.position.x<4f && vert.position.y>-2f && vert.position.y<2f)
    {
        gTexCoord=vec2(vert.texcoord.z,vert.texcoord.y);
        gl_Position = vert.position + vec4(vert.size.x,vert.size.y,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.x,vert.texcoord.y);
        gl_Position = vert.position + vec4(0.0,vert.size.y,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.z,vert.texcoord.w);
        gl_Position = vert.position + vec4(vert.size.x,0.0,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.x,vert.texcoord.w);
        gl_Position = vert.position;
        EmitVertex();

        EndPrimitive();
    }
}

Vertex shader

#version 150
#extension GL_ARB_explicit_attrib_location : enable

layout (location = 0) in vec2 position;
layout (location = 1) in vec4 textureCoord;
layout (location = 2) in vec2 size;
uniform mat4 oMatrix;
uniform vec2 offset;
out VertexData
{
    vec4 position;
    vec4 texcoord;
    vec4 size;
} outData;

void main()
{
    outData.position = oMatrix * vec4(position.x+offset.x,position.y+offset.y,0,1);
    outData.texcoord = textureCoord;
    outData.size = oMatrix * vec4(size.x,size.y,0,0);
}

Đừng quên thông báo cho bản thân về các tính năng chấp nhận và bỏ phiếu.
Christian Rau

2
"Đừng quên thông báo cho bản thân về các tính năng chấp nhận và bỏ phiếu." Đọc: "Chấp nhận câu trả lời của tôi."
Jonathan Connell

1
@Jonathan Không có nghĩa như vậy. Sẽ không thô lỗ khi không chấp nhận nếu câu trả lời không có ích. Thật ra OP có thể đã chấp nhận câu trả lời của tôi quá nhanh (xin lỗi vì điều đó). Nhưng tôi thường (ngay cả trong cuộc đời SO ngắn ngủi của mình) Tôi thấy khách truy cập một lần hỏi một câu hỏi và sau đó hoàn toàn quên nó (có thể họ đã tự giải quyết 3 phút sau hoặc họ nhầm trang này là một diễn đàn). Nhưng hệ thống danh tiếng là động lực của trang web hỏi đáp định hướng phản hồi này. Nó không có nghĩa là ngay lập tức chấp nhận câu trả lời của tôi mà không cần suy nghĩ, nhưng như đã viết, để nhận thức được tính năng chấp nhận (như nhiều người mới không biết).
Christian Rau

@Jonathan Và nhân tiện, tôi đã viết những lời nhắc nhở đó trong những câu hỏi đầu tiên không được tôi trả lời. Nhưng bạn nói đúng ở đây là một chút tự can thiệp ở đây.
Christian Rau

1
@Christian Rau Điều này thực sự đôi khi xảy ra mặc dù có lẽ tốt nhất là mang lại cho mọi người lợi ích của sự nghi ngờ. Nếu bạn muốn đăng bình luận, "Chào mừng, vui lòng đọc quy tắc trang web" sẽ phù hợp hơn IMO :) Oh và +1 cho câu trả lời của bạn;)
Jonathan Connell

Câu trả lời:


5

Trước hết, bạn sẽ không thể sử dụng structs cho các dữ liệu khác nhau (thay đổi 1,50), nhưng bạn vẫn có thể sử dụng inoutthay vì attributevarying. Ngoài ra, bạn phải ghi vào biến dựng sẵn gl_Positiontrong shader đỉnh (thay đổi 1,40). Vì vậy, trong shader đỉnh của bạn thay thế khai báo outDatabằng một cái gì đó tương tự như

out vec4 texcoord;
out vec4 vSize;       //size already used

và sử dụng gl_Positionthay vì outData.position.

Tôi không chắc phần mở rộng ARB_explicit_attrib_location đã là cốt lõi hay chưa, vì vậy có lẽ bạn phải thêm

#extension ARB_explicit_attrib_location : require

để sử dụng layoutcú pháp hoặc chỉ đặt các vị trí thuộc tính trong ứng dụng bằng cách gọi glBindAttribLocationtrước khi liên kết trình đổ bóng, nếu phần mở rộng này không được cung cấp.

Trong shader hình học thay đổi sự phân cấp của đỉnh thành một cái gì đó như

in vec4 texcoord[];      //names have to match vertex shader, of course
in vec4 vSize[];

Mặc dù bạn chỉ nhận được một đầu vào duy nhất (như bạn đang sử dụng điểm), chúng vẫn phải là mảng, tôi nghĩ (mặc dù luôn luôn lập chỉ mục với [0], khi được sử dụng). Thay đổi việc sử dụng vert.positionthành gl_PositionIn[0].

Tiếp theo, tôi nghĩ rằng layoutcú pháp cho trình đổ bóng hình học đã được giới thiệu trong 1.50, vì vậy bạn có thể phải thiết lập bố cục trình tạo bóng hình học trong ứng dụng bằng phương tiện glProgramParameteri.

Tôi phải thừa nhận rằng tôi chưa có nhiều kinh nghiệm thực tế với các shader hình học hoặc cú pháp hiện đại, vì tôi vẫn ngồi trên phần cứng 2.1, nhưng tất cả những thay đổi này có thể được suy luận bằng cách xem xét các thông số kỹ thuật tương ứng . Chỉ cần nhìn vào nhật ký thông tin shader nếu quá trình biên dịch (hoặc liên kết) không đạt được một số gợi ý về những gì có thể sai.

Việc thiếu layoutcú pháp ở cả đỉnh và trình đổ bóng hình học là những điều duy nhất có thể yêu cầu một số bổ sung nhỏ vào mã ứng dụng của bạn, nhưng tôi không hoàn toàn chắc chắn liệu chúng có thực sự không được khuyến khích hay không, vì vậy hãy thử chúng lần cuối.

Ngoài ra, vui lòng cập nhật câu hỏi của bạn nếu tôi bỏ lỡ bất cứ điều gì và các shader vẫn không hoạt động, có thể lần này với một số thông báo lỗi từ trình biên dịch GLSL.


Cảm ơn! Giảm xuống # 140, nhưng # 130 nằm trong tầm tay của tôi :)
khi

1
@n Whileatic Vì vậy, những gì bạn đã thay đổi và những gì vẫn không hoạt động. Có lẽ bạn có thể chỉnh sửa câu hỏi của mình để bao gồm các shader 1,40 mới. Nếu bạn đã có 1.40, có lẽ bạn chỉ cần thay đổi việc sử dụng các tùy chỉnh của bạn positionkhác nhau to gl_Position`.
Christian Rau
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.