2012-08-24 36 views
6

Xin lỗi tôi sẽ viết lại câu hỏi với hy vọng sẽ rõ ràng.Vị trí mảnh vỡ GLSL

Trong mã .cpp của tôi, tôi tạo một danh sách các tứ, một vài trong số chúng có cờ, trong trình đổ bóng pixel tôi kiểm tra xem cờ này có được đặt hay không, nếu cờ không được đặt, số bốn sẽ được tô màu ví dụ, nếu cờ được đặt, tôi muốn quyết định màu của từng pixel, vì vậy nếu tôi cần tô màu một nửa của cờ được gắn cờ màu đỏ và nửa còn lại màu xanh lam, tôi có thể làm một cái gì đó như:

if coordinate in quad < something color = red 
else colour = blue; 

Bằng cách này, tôi có thể nhận được một nửa số màu có màu xanh dương và một nửa màu đỏ, hoặc tôi có thể quyết định vị trí đặt màu đỏ hoặc nơi đặt màu xanh.

Hãy tưởng tượng tôi đã có một quad 50x50 pixel

[frag]

if(quad.flag == 1) 
    {  
    if(Pixel_coordinate.x<25) gl_fragColor = vec4(1.0, 0.0, 0.0, 1.0); 
    else gl_fragColor = vec4(0.0, 1.0, 0.0, 1.0); 
    } 
else 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 

Trong trường hợp này, tôi hy vọng rằng một quad với cờ sẽ nhận được hai màu sắc mỗi khuôn mặt. Tôi hy vọng tôi đã cụ thể hơn bây giờ.

cảm ơn.

Chỉ cần thêm một cái gì đó tôi không thể sử dụng bất kỳ kết cấu nào.

Ok tôi làm điều này bây giờ:

Mỗi quad đã 4 kết cấu phối hợp (0,0), (0,1), (1,1), (1,0);

tôi cho phép các kết cấu tọa độ sử dụng:

glTexCoordPointer(2, GL_SHORT, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 7)); 

[vert]

varying vec2 texCoord; 

main() 
{ 
    texCoord = gl_MultiTexCoord0.xy; 
} 

[frag]

varying vec2 texCoord; 

main() 
{ 
    float x1 = texCoord.s; 
    float x2 = texCoord.t; 

    gl_FragColor = vec4(x1, x2, 0.0, 1.0); 
} 

tôi nhận được lúc nào cũng là màu vàng nên x1 = 1 và x2 = 1 hầu như luôn luôn và một số quad là màu vàng/xanh lá cây.

Tôi cho rằng kết cấu tọa độ thay đổi trong trình đổ bóng phân đoạn và vì vậy tôi sẽ nhận được độ dốc, tôi có sai không?

+0

Để * "hiểu" * vị trí nào (và do đó cái gì * "nửa" * của hình học)? Vị trí không gian màn hình? Thế giới không gian? Vị trí không gian xem? Cái nào? –

+0

Vị trí địa phương là gì, ý của bạn là vị trí của quad trong không gian thế giới hay cái gì? Điều gì có nghĩa là * "tô màu các điểm ảnh một nửa và một nửa" *? Việc sử dụng cờ này có bất kỳ ý nghĩa nào đối với câu hỏi thực tế (có nghĩa là nó là lá cờ này bạn muốn tính toán động bằng cách nào đó dựa trên * "hiểu vị trí" *)? Tôi có một thời gian thực sự khó khăn để hiểu những gì bạn thực sự muốn đạt được. –

Trả lời

4

Nếu bạn muốn biết tọa độ trong phạm vi quad, bạn cần tự tính toán nó. Để làm được điều đó, bạn cần phải tạo một nội suy mới (gọi nó là vec2 quadCoord) và đặt nó một cách thích hợp cho mỗi đỉnh, có nghĩa là bạn cũng sẽ cần phải thêm nó làm thuộc tính và chuyển nó qua đỉnh của bạn đổ bóng. ví dụ:

// in the vertex shader 
attribute vec2 quadCoordIn; 
varying vec2 quadCoord; 

main() { 
    quadCoord = quadCoordIn; 
       : 

Bạn sẽ cần phải nạp vào thuộc tính này trong mã vẽ khi vẽ quad. Đối với mỗi quad, các đỉnh sẽ có khả năng có giá trị quadCoordIn của (0,0), (0,1), (1,1) và (1,0) - bạn có thể sử dụng một số hệ tọa độ khác nếu bạn thích, nhưng đây là cách dễ nhất.

Sau đó, trong chương trình phân đoạn của bạn, bạn có thể truy cập quadCoord.xy để xác định vị trí trong tứ giác.

+0

Hi Chris, cảm ơn bạn đã trả lời, chỉ là một điều nữa, tôi nghĩ rằng nếu tôi không cho phép một kết cấu trong mã cpp của tôi thì tọa độ kết cấu là hằng số hoặc 0 hoặc 1 tôi đã phát hiện ra điều này vì tô màu mảnh với tọa độ kết cấu tôi nhận được chỉ có hai màu sắc, là điều này đúng (tôi có nghĩa là, tôi cần cũng để kích hoạt và ràng buộc một kết cấu hoặc opengl sẽ không cho tôi các tọa độ kết cấu chính xác trong shader mảnh?) – user1583007

2

Ngoài câu trả lời Chris Dodd 's, bạn cũng có thể truy cập vào màn hình không gian tọa độ (tính theo pixel, mặc dù trên thực tế các trung tâm pixel và do đó ?.5) của đoạn hiện xử lý thông qua các đoạn đặc biệt shader biến gl_FragCoord:

gl_FragColor = (gl_FragCoord.x<25.0) ? vec4(1.0, 0.0, 0.0, 1.0) : vec4(0.0, 1.0, 0.0, 1.0); 

Nhưng điều này sẽ cho bạn vị trí của đoạn trong không gian màn hình và do đó tương ứng với góc dưới bên trái của chế độ xem bạn. Nếu bạn thực sự cần phải biết vị trí bên trong quad cá nhân (có ý nghĩa hơn nếu bạn muốn thực sự màu mỗi quad nửa rưỡi, kể từ khi "cắt một nửa" nếu không sẽ khác nhau với vị trí của quad), sau đó Chris Câu trả lời của Dodd là cách tiếp cận chính xác.

+0

Hi Christian, cảm ơn bạn trả lời, bạn phải, tôi cần phải truy cập mọi quad đơn giản để gl_FragCoord không làm việc cho tôi: ( – user1583007

Các vấn đề liên quan