VietNam XNA game development Community
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.
Admin đã trở lại và lợi hại gấp đôi :D

Sun May 18, 2014 1:05 pm by admin_huyetsat

Sorry mọi người vì mình vắng mặt quá lâu, mình là HuyetSat, admin đây.

Hiện tại mình đã chuyển nền tảng phát triển game sang mobile (dùng libgdx framework) và cũng đang dev game và up lên play store, ai dùng đt android thì tải về ủng hộ ad nha:

play.google.com/store/apps/developer?id=Top+Game+Free

[img]…

[ Full reading ]

Comments: 1

Game4V và Event "Viết bài hay, nhận ngay quà tặng"

Mon Feb 20, 2012 11:18 pm by noheart91

Game4V là một trong những cộng đồng game thủ đầu tiên của Việt Nam với lịch sử hơn 5 năm hình thành và phát triển. Sau nhiều biến động, có thể nói hiện nay G4V là một cộng đồng game hoạt động hoàn toàn độc lập, không bị ảnh hưởng bởi tổ chức chuyên nghiệp nào với nền tảng máy chủ được trang bị từ …

[ Full reading ]

Comments: 0

cho minh tham gia lam game

Sat Sep 03, 2011 8:56 am by nvtu553

cho minh đăng kí 1 chổ nha;minh muốn dăng kí làm code
thanks,

Comments: 0

Mình sẽ tạm dừng hoạt động một thời gian

Fri Sep 02, 2011 7:19 am by HuyetSat

Vì lý do cá nhân nên tạm thời mình sẽ ko support xna trên các diễn đàn nữa.

Bạn nào gặp vấn đề về xna cứ mail trực tiếp cho mình.
thanh_vinh648@yahoo.com

Thân

Comments: 0

xin cho minh tham gia voi

Fri Apr 15, 2011 12:35 am by luongthanhbinh3824

Mình giỏi 3ds max có thể cho mình làm designer được không anh HuyetSat
Email: thanh_binh3824@yahoo.com
Phone: 0633703673

Comments: 1

Latest topics
» Xin TUT game bắn trứng khủng long
by anhkhoa2110 Mon Mar 16, 2015 4:29 pm

» xna getRGB texture image?
by bachdienquan Thu Feb 05, 2015 8:34 am

» Cần giúp đỡ về hiệu ứng hình ảnh khi va chạm
by phiemltv Fri Nov 28, 2014 12:20 pm

» Cho mình hỏi về boundbox
by septimus2810 Mon Jul 21, 2014 10:08 am

» Hỏi về cách di chuyển 1 điểm ở tọa độ này sang tọa độ khác cho trước.
by septimus2810 Mon Jul 21, 2014 10:02 am

» Admin đã trở lại và lợi hại gấp đôi :D
by konamij Fri Jun 27, 2014 2:50 pm

» lỗi An unhandled exception of type 'System.NullReferenceException'
by _VH_HV_ Mon Jun 16, 2014 1:59 pm

» networking cho game xna 2d
by admin_huyetsat Tue May 20, 2014 1:04 pm

» hướng dẫn traning C# chuẩn bị cho xna
by lqchinh Tue Apr 15, 2014 11:31 pm

» HelpGameBom2D
by thaimavn Mon Mar 24, 2014 10:35 am

» Hỏi về cách di chuyển 1 điểm ở tọa độ này sang tọa độ khác cho trước.
by bocapzz Mon Feb 24, 2014 10:45 pm

» Hỏi về cài đặt XNA game studio 4.0
by bocapzz Sat Dec 14, 2013 12:33 am

» Cuộc thi lập trình game thế giới 2013 với cơ hội thăm quan Phần Lan
by viope Tue Oct 29, 2013 4:51 pm

» chơi game làm bởi xna như thế nào?
by thinnhph01957 Sat Sep 14, 2013 3:23 pm

» Với 1 Game cái gì là quan trọng ?
by qhhqnavy Tue Aug 13, 2013 8:09 am

» Load fiel .fbx vào Xna bị mất màu
by qhhqnavy Wed Aug 07, 2013 7:42 pm

» Help me hàm Update và Draw với
by sieuthi Mon Dec 24, 2012 11:56 pm

» Hỏi về load hình chồng nhau trong XNA
by sieuthi Mon Dec 24, 2012 11:49 pm

» nơi ghi danh tham gia Game Development Team
by echdonghop Fri Dec 21, 2012 1:56 pm

» tài liệu cơ bản 5 chương cho xna
by Nelson Quang Thu Nov 22, 2012 12:26 pm


HLSL basic

Go down

HLSL basic Empty HLSL basic

Bài gửi by HuyetSat Sat Apr 03, 2010 6:29 pm

HLSL có cú pháp cơ bản như C, tuy nhiên cách lập trình chúng lại rất khác so với cách XNA tạo ra 1 game cho bạn. do đó nếu bạn cảm thấy chán nản khi lập trình cho shader bằng HLSL thì cũng đừng buồn. thực tế trong game development, người ta chia lập trình shader và game (dùng XNA, DirectX...) làm 2 bộ phận riêng biệt

Tuy nhiên , biết HLSL bạn có thể tạo ra những hiệu ứng sống động mà NNLT khác bó tay, nó là 1 phần của XNA. Trong tài liệu này chỉ nêu ra những yếu tố cơ bản của HLSL cùng những ví dụ đơn giản. khi bạn bắt tay vào viết game thực sự, việc sử dụng HLSL ntn tùy thuộc trình độ và tài nguyên của bạn!

Chém gió vậy Được rùi, h chúng ta bắt đầu nào:
1.Cú pháp

Cách khai báo biến của HLSL giống như C# (như là int, string, float,return, void... là các từ khóa)
Một số kiểu phức tạp hơn như Vector, cái chúng ta hay dùng, thường thì khai báo Các vector với 3 hay 4 thành phần sẽ là float3s và float4s

Các kiểu float3 và float4 về cơ bản là mảng các giá trị số thực, ví như ta dùng float4 để khai báo 1 màu :
float4 color = float4(1, 0, 0, 1);

Do kiểu float4 là mảng số thực nên phép gán sau hợp lệ:
float red = color[0];
Nó trả về giá trị là 1
Ngoài ra 4 giá trị của foat4 có thể biểu diễn theo các chứ cái của bảng màu RGBA hay x,y,z,w như sau:
float blue = color.b
float z = color.z
Không những thế bạn có thể tạo ra 1 float4 mới dựa vào việc tráo các thành phần của float4 có sẵn như sau:
float4 reverse = color.abgr;
Bạn có thể tạo ra ma trận bằng kiểu float4x4
float4x4 matrixFun;
matrix <float, 4, 4> matrixMadness;
Cấu trúc (struc) của HLSL cũng giống của C# như sau
struct myStruct
{
float4 position;
};
2.Mổ xẻ một ví dụ mẫu:

Trong một effect của XNA chứa code HLSL, đó là file fx, bạn đã có những hiểu biết cơ bản về HLSL bây h chúng ta tìm hiểu về 1 ví dụ đơn giản:

Code:
float4x4 World;
float4x4 View;
float4x4 Projection;
struct VertexShaderInput
{
float4 Position : POSITION0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
return output;
}
float4 PixelShaderFunction( ) : COLOR0
{
return float4(1, 0, 0, 1);
}
technique Technique1
{
pass Pass1
{
VertexShader = compile vs_1_1 VertexShaderFunction( );
PixelShader = compile ps_1_1 PixelShaderFunction( );
}
}
Bạn đừng cảm thấy quá sợ hãi trước đoạn code trên, tuy chúng khác xa những cái bạn dùng trong XNA nhưng chúng ta sẽ mổ sẽ từng phần 1, bạn hãy chú ý 3 dòng đầu tiên:
Code:

float4x4 World;
float4x4 View;
float4x4 Projection;

Chúng hoàn toàn quen thuộc với các Matrix World của object , View và Projection mà bạn tạo cho 1 camera.

Bạn đã dùng code sau để draw model trong XNA? :
Code:
foreach (BasicEffect be in mesh.Effects)
{
be.EnableDefaultLighting( );
be.Projection = camera.Projection;
be.View = camera.View;
be.World = GetWorld( ) *
Mesh.ParentBone.Transform;
}
Điều này nghĩa là BasicEffect cũng đc viết bằng HLSL và ở đây chúng ta có sự tương đồng về biến sử dụng.

Chú ý đến phần technique, chúng khai báo cho hệ thống biết thiết bị cần hỗ trợ vertexShader và pixcelShader tới mức nào: chúng gọi ra 2 hàm được khai báo trước đó.
technique Technique1
{
pass Pass1
{
VertexShader = compile vs_1_1 VertexShaderFunction( );
PixelShader = compile ps_1_1 PixelShaderFunction( );
}
}
Pass1 là 1 phần của 1 technique, khi thực hiện technique thì các pass sẽ đc lặp đi lặp lại tạo thành 1 hiệu ứng. một fx có thể có nhiều technique khác nhau.

Đây là 1 hàm trả về vertexShaderOutput
//tham số cần nhập có cấu trúc đc định nghĩa tiếp dưới đây:
Code:
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
//cấu trúc này định nghĩa phần tiếp dưới đây
VertexShaderOutput output;
//
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
return output;
}
Đây là cấu trúc của 2 dữ liệu đã nói ở trên:
struct VertexShaderInput
{
float4 Position : POSITION0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
};
Bạn thấy số 0 sau chữ POSITION, nó là cho thấy Position là một biến thuộc của semantic của HLSL. Nghĩa là Position là 1 mảng và mảng đó có 1 phần tử được đánh số thứ tự là 0, phần tử đó chính là Position!
Đây là danh sách các kiểu semantic: nếu chúng ta dùng cho các vertexInput thì dùng bảng dưới đây



Nếu là Vertex Output thì dùng bảng dưới đây:

Khi sử dụng effect, bạn cần cung cấp các tham số của nó những giá trị thích hợp - chúng đc khai báo đâu chương trình. các biến thuộc loại semantics thì ko cần, chúng chỉ đc sử dụng khi lập trình HLSL thông qua các kiểu dữ liệu phù hợp.
Code:
float4 PixelShaderFunction( ) : COLOR0
{
return float4(1, 0, 0, 1);
}
Method trên luôn trả về giá trị float4(1, 0, 0, 1);.
Điều này tức là màu trả về luôn là màu đen trắng hay đây là 1 effect biến đổi màu sắc của bức ảnh về màu đen trắng!

Hiệu ứng đảo màu
bạn dùng đoạn code sau và thay cho mã nguồn thích hợp ở hiệu ứng ban đầu
Code:
float4 PixelShader(VertexOut input) : COLOR0
{
float4 output = 1-tex2D(ColoredTextureSampler, input.textureCoordinates);
return output;
}

Hiệu ứng làm mờ:

Code:
float4 PixelShader(VertexOut input) : COLOR0
{
float4 Color;
Color = tex2D(ColoredTextureSampler, input.textureCoordinates.xy);
Color += tex2D(ColoredTextureSampler, input.textureCoordinates.xy + (0.01));
Color += tex2D(ColoredTextureSampler, input.textureCoordinates.xy - (0.01));
Color = Color / 3;
return Color;
}
Nó yêu cầu pixelShader tối thiểu

PixelShader = compile ps_1_4 PixelShader( );

source: http://www.mediafire.com/?ig0jrljtm11
HuyetSat
HuyetSat
Administrator

Tổng số bài gửi : 167
Điểm : 1291
Danh Tiếng : 19
Join date : 30/03/2010
Đến từ : Microsoft

https://xvna.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết