2012-02-23 19 views
5

đầu tiên rồi lên Tôi đang sử dụng:DirectX kết cấu Clip gian phối

  • DirectX 10
  • C++

Được rồi đây là một chút của một kỳ lạ đối với tôi, tôi sẽ không thường đặt câu hỏi, nhưng tôi đã bị ép buộc bởi hoàn cảnh. Tôi có hai hình tam giác (không phải là một quad vì lý do tôi sẽ không đi vào!) Toàn màn hình, liên kết với màn hình thông qua thực tế họ không được chuyển đổi.

Trong khai báo đỉnh DirectX, tôi đang truyền phao 3 thành phần (Pos x, y, z) và phao 2 thành phần (Texcoord x, y). Texcoord z được dành riêng cho mảng texture2d, mà tôi hiện đang mặc định là 0 trong trình đổ bóng pixel.

tôi đã viết này để đạt được các nhiệm vụ đơn giản:

float fStartX = -1.0f; 
float fEndX = 1.0f; 
float fStartY = 1.0f; 
float fEndY = -1.0f; 
float fStartU = 0.0f; 
float fEndU = 1.0f; 
float fStartV = 0.0f; 
float fEndV = 1.0f; 
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV)); 
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV)); 
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV)); 
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV)); 

IA Layout: (Update)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = { 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 } 
}; 

dữ liệu đạt đến vertex shader theo định dạng sau: (Cập nhật)

struct VS_INPUT 
{ 
    float3 fPos   :POSITION; 
    float3 fTexcoord  :TEXCOORD0; 
} 

Bên trong Vertex và Pixel shader của tôi không có nhiều xảy ra cho cuộc gọi vẽ cụ thể này, trình đổ bóng pixel thực hiện hầu hết mẫu lấy mẫu từ kết cấu bằng cách sử dụng tọa độ UV được chỉ định. Tuy nhiên, điều này không hoạt động như mong đợi, có vẻ như tôi chỉ nhận được chỉ 1 pixel của kết cấu được lấy mẫu.

Cách giải quyết là trong pixel shader phải làm như sau: (Update)

sampler s0      : register(s0); 
Texture2DArray<float4> meshTex : register(t0); 
float4 psMain(in VS_OUTPUT vOut) : SV_TARGET 
{ 
    float4 Color; 
    vOut.fTexcoord.z = 0; 
    vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f; 
    vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f; 
    vOut.fTexcoord.x += 0.5f; 
    vOut.fTexcoord.y += 0.5f; 
    Color = quadTex.Sample(s0, vOut.fTexcoord); 
    Color.a = 1.0f; 
    return Color; 
} 

Đây cũng là đáng chú ý rằng đây làm việc với VS sau ra struct định nghĩa trong shaders:

struct VS_OUTPUT 
{ 
    float4 fPos   :POSITION0; // SV_POSITION wont work in this case 
    float3 fTexcoord :TEXCOORD0; 
} 

Bây giờ tôi có kết cấu được kéo dài để vừa với toàn bộ màn hình, cả hai hình tam giác đã bao phủ này, nhưng tại sao kết cấu UV không được sử dụng như mong đợi?

Để làm rõ tôi đang sử dụng một bộ lấy mẫu điểm và đã thử cả kẹp và gói UV.

Tôi hơi tò mò và tìm thấy giải pháp/giải pháp được đề cập ở trên, tuy nhiên tôi không muốn làm điều đó nếu có ai biết tại sao nó xảy ra?

Trả lời

1

Được rồi, đối với một, kết cấu tọa độ ngoài phạm vi 0..1 bị kẹp. Tôi đã mắc sai lầm khi giả định rằng bằng cách chuyển tới không gian clip -1 đến +1 thì tọa độ kết cấu sẽ là quá. Đây không phải là trường hợp, họ vẫn đi từ 0,0 đến 1,0.

Lý do tại sao mã trong trình đổ bóng pixel làm việc, là vì nó đang sử dụng khoảng trắng x, y, z tọa độ để tự động ghi đè lên các tọa độ kết cấu này; một sự giám sát về phía tôi. Tuy nhiên, mã shader pixel dẫn đến kết cấu căng trên toàn màn hình 'quad', vì vậy nó có thể hữu ích cho ai đó ở đâu đó;)

1

Bạn đang xác định ngữ nghĩa nào cho loại đỉnh của mình? Họ có phù hợp với các đỉnh của bạn và cũng đổ bóng của bạn? Nếu bạn đang sử dụng một D3DXVECTOR4, thiết lập D3DXVECTOR3 (như thể hiện trong mã VS của bạn) điều này có thể là một vấn đề nếu CreateVertex() của bạn trả về một cấu trúc D3DXVECTOR3, D3DXVECTOR2. Cũng sẽ yên tâm khi xem mã trình tạo pixel của bạn.

+0

câu hỏi được cập nhật, đừng thấy nó liên quan như thế nào làm việc trong môi trường này trong một thời gian dài. – Jay

+0

CreateVertex không có gì đặc biệt, trả về những gì tôi muốn. Chỉ có điều có thể khác biệt là texcoord Z không được sử dụng và còn lại để sử dụng mảng kết cấu trong tương lai. – Jay

+0

Căn chỉnh là chính xác, sải chân là giá trị đúng 24 byte, (không phải là bội số tốt đẹp của 16 byte nhưng nó vẫn hoạt động như dx auto pads this) – Jay