class Data
{
  public int Item;
  public override string ToString()
  {
    return item.ToString();
  }
}

Data data = new Data();
data.Item = 10;
listBox1.Items.Add(data);
위와 같은 코드를 실행하면 리스트에 10이 잘 나오지만.. 후에 data의 item을 변경해도 리스트에서는 변하지 않는 것을 볼수 있습니다.. 이 것을 해결하려면

속성창에서 DrawMode를 OwnerDrawFixed로 변경하고, DrawItem 이벤트에 대한 함수를 만들고
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
  e.DrawBackground();
  e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font,
    new SolidBrush(e.ForeColor), e.Bounds);
  e.DrawFocusRectangle();
}
이렇게 하면 변경된 값을 제대로 보여주게 됩니다..
주의할점은 리스트가 자동으로 다시 그려지지 않기 때문에.. 아이템의 값이 변경된후에 listBox1.Invalidate()를 호출하여서 다시 그리게 하여야합니다..
Posted by orange code
TAG .NET, c#

버텍스,픽셀 쉐이더에 입문하기 위해서 .fx파일을 작성하는데.. 이걸 C#+MDX에서 읽으려는데 방법을 몰라 그냥 무작정 해봤습니다....

.fx로 작성된 파일은 Effect.FromFile 메서드로 읽어올수 있습니다.. 그러면 Effect 객체를 얻을수 있는데.. 이놈으로 그 효과를 볼수있습니다.. 그런데 이 메서드가 좀 이상한게 주소에 한글이 들어가 있으면 파일을 제대로 찾지를 못합니다.. 그래서 저는 StreamReader.ReadToEnd로 모조리 읽은 다음에 Effect.FromString으로 해결했습니다.. 이건 잘되네요..
string source = new StreamReader("파일이름").ReadToEnd();
Effect effect = Effect.FromString(device, source, null, null, ShaderFlags.None, null);
옵션은 그냥 전부 기본값으로 채웠습니다..

이렇게 읽어온 이펙트는 이렇게 씁니다..
effect.Technique = "technique1"; // 테크닉 이름을 선택합니다..
int passes = effect.Begin(FX.None);
for (int pass = 0; pass < passes; pass++)
{
    effect.BeginPass(pass);
    // 여기에 이펙트가 적용될 놈들 그리기
    effect.EndPass();
}
effect.End();

사실 쓰는데는 큰 어려운건 없는데 검색하려니까 잘 안나와서.. 직접해보고 간단히 정리해봅니다..

'컴퓨터 프로그래밍 > Direct3D' 카테고리의 다른 글

Direct3D projection Effect  (0) 2009.12.02
[C# + MDX 프로그래밍] HLSL  (0) 2008.12.17
3DS Viewer 만들기 (미완성)  (0) 2008.10.30
Posted by orange code

3D는 매번 시작할때마다 바로 좌절해버리는데 이번에도 마찬가지..
이번에는 3DS 뷰어를 만들겠다하고 검색하다가 이런곳을 발견..
http://archive3d.net/ 
3ds파일이 꽤 많아 테스트하기에 좋다고 생각하고, 자동차 하나를 받았습니다..


이런 자동차..

ase는 예전에 해봤는데 3ds포맷은 처음 해보는거라 일단 구글검색하여 페이지를 찾았습니다...
http://www.the-labs.com/Blender/3dsspec.html
http://www.martinreddy.net/gfx/3d/MLI.spec
3ds파일안에 material정보가 있는데 그 부분은 .mli 파일과 동일하다고 안적어놔서.. 따로 찾았네요.. (두번째 링크)

개발환경은 win xp, vs2008, c#, direct3d 입니다.. 
c++은 쓸데업는 코딩이 많고, opengl은 쓰려면 여기저기 찾아봐야되기 때문에... c#과 direct3d 가 된거죠..-_-;
어쨌든 결과적으로 미완성입니다... 왜냐면 정점들을 읽어서 출력하는건 알겠는데...
material이라든지 lighting 관련된건 하나도 모르겠거든요...

채우기로 하면 그냥 다 하얗게 나오기 때문에 와이어프레임으로 해놨습니다..
텍스쳐를 붙이면 좀 나아지겠지만 그 다음부터가 진도나가기 쉽지 않네요..
어쨌든 결과물을 올립니다.. Managed DirectX 입문에는 약간 도움이 되지 않을까 하네요 -_-;;

'컴퓨터 프로그래밍 > Direct3D' 카테고리의 다른 글

Direct3D projection Effect  (0) 2009.12.02
[C# + MDX 프로그래밍] HLSL  (0) 2008.12.17
3DS Viewer 만들기 (미완성)  (0) 2008.10.30
Posted by orange code
TAG 3ds, c#, Direct3D

Visual Studio도 MSDN도 없이 C# 프로그래밍을 한 적이 있습니다. (인터넷도 안됩니다..)
csc와 메모장만으로 프로그래밍을 했었는데 그 때 제가 알고 있던 System.Reflection의 기능들 덕분에 많은 일이 가능했습니다..
알고 있던건 내용으로 우선 typeof로 Type 개체를 가져오고 GetMethods, GetProperties등의 함수로 타입들의 함수, 속성, 이벤트등을 알수 있었습니다. 그래서 이 기능을 이용해서 닷넷 dll을 다 읽어와 모든 타입의 정보를 html로 저장해버렸고, 원하는 타입의 함수, 속성등을 찾아볼 수 있게 되었습니다.
하지만 html파일에 없는 정보를 알고 싶을때는 프로그램을 수정하여 다시 html를 만들어야했기 때문에 시간이 오래걸렸습니다. 그래서 나중에는 System.Net 에 있는 소켓을 사용하여 작은 웹서버를 만들어 원하는 타입의 이름을 입력하면 즉석에서 정보를 가져와 보여주도록 했고, 이것으로 html을 매번 만들필요도 없어졌습니다.

그렇다면 그런 일을 가능하게 해준 이 기능은 어떻게 쓰는 것인가...

일단 Type의 개체는 typeof(타입이름) 혹은 변수.GetType()으로 가져올 수 있습니다.

Type type = typeof(string);

string str = "abc";
Type type = str.GetType();

설명은 일단 MSDN으로 대체합니다.

Posted by orange code

티스토리 툴바