
GLSL로 작성된 쉐이더의 소스코드를 볼 때에도 아래의 nVidia Cg에서 처럼의 Syntax Highlight를 적용시키고 싶었다. 흰바탕에 검정글씨, 파란 글씨만 있는 것은 눈에 들어오지 않아서, 약간의 웹서핑 후에 다음의 사이트를 찾게 되었다.
Syntax Coloring in Visual Studio .NET
그리고 관련된 파일은 여기에 있다.
http://www.clockworkcoders.com/oglsl/OGLSL-syntaxcolor-1.0.zip
여기에 있는 파일들을 바탕으로 지금 내가 사용하는 설정에 맞도록 수정한 파일은 다운로드 받도록 해놓았다. 차이점은 usertype.dat 파일에 키워드들을 정리해 놓는데, 나는 Cg와 GLSL을 모두 사용하게 되어서 양쪽의 키워드를 모두 적어놓은 파일과 레지스트리에 키 값을 적을 때에 Cg에 관련된 키값도 적도록 하였다.
1204193990.zip
다시 말하면, GLSL과 Cg의 Syntax Highlight를 모두 지원하도록 한다고나 할까?
[2007/6/23] cgfx, fx도 되도록 약간 변경했다.
[2007/7/3] cgh, fxh도 되도록 약간 변경하고, Visual Studio 6용 reg 파일도 추가했다.
설치법은 다음과 같다.
비주얼 스튜디오 .2005의 경우
1. 첨부된 파일 중에서 usertype.dat 파일을
C:\Program Files\Microsoft Visual Studio 8\Common7\IDE 이 위치에 복사한다.
2. 첨부파일 안에 있는 install_highlighting_vs80_glsl_cgfx_hlsl.reg 파일을 더블 클릭해서 레지스트리에 등록시킨다.
비주얼 스튜디오 .2003의 경우
1. 첨부된 파일 중에서 usertype.dat 파일을
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE 이 위치에 복사한다.
2. 첨부파일 안에 있는 install_highlighting_vs71_glsl_cgfx_hlsl.reg 파일을 더블 클릭해서 레지스트리에 등록시킨다.
비주얼 스튜디오 6의 경우
1. 첨부된 파일 중에서 usertype.dat 파일을
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin 이 위치에 복사한다.
2. 첨부파일 안에 있는 install_highlighting_vs60_glsl_cgfx_hlsl.reg 파일을 더블 클릭에서 레지스트리에 등록시킨다.
내 홈피의 뒷받침을 해주고 있는 테터툴즈를 1.0.6.1로 업그레이드 하고 몇 가지 플러그인을 설치하였다. 테터의 개방된 구조를 지향하는 올바른 개발자 철학이 맘에 든다.
여러 플러그인 중에 가장 끌렸던 것은 소스의 Syntax Highlight 기능.
사실 이 사이트에 소스를 많이 올린 편은 아니지만, 올린 소스도 그다지 이쁘게 표현되지 않았던 것이 사실이다.
테터의 플러그인 페이지에 가면 몇 가지가 있지만 가장 편하고 이뻐 보이는 것은 후리자 님이 만든 테터코드 하이라이트 플러그인 v0.93이 었다.
적용예는 맨 밑에 있다. 아주 맘에 든다… 깔끔하고..
일단 이걸 하고, 내 홈피의 나머지 소스 부분 얼마 있진 않지만 거기도 다 이걸로 바꿔야 겠다. ㅎㅎㅎㅎ
에러코드 잡기
그런데 플러그인을 적용할 때 문제가 있었었다.
에러가 반환되었던 것… 후리자 님의 방법에 따라서 에러코드가 나오는 ch_main.js를 넣고 실행을 했었는데, 에러코드가 0이 나왔었고, 스크립트를 좀 뜯어봤더니 에러가 나는 곳은….
ch_main.js 의 41번째 라인에서.
var html = “ ” + iframe.contentWindow.document.body.innerHTML + “ ”;
iframe.contentWindow까지는 얻어오는 데 그 밑에 document 이하를 못 얻어오고, 얻어오고자 하면 익스플로러 아래의 상태줄에 Error 접근 권한이 없습니다. 이런 에러가 떳었다.
그러다가 어찌어찌 하다 보니.. 소스를 고치진 않았는데 그냥 되버렸다. 제대로 contentWindow도 얻어오고.. 희안했다. 답을 알았으면 후리자님 블로그에 댓글이라도 남길려고 했는데.. 어영부영 이상하게 되버려서 답을 적다가 말았다.
되서 좋긴 한데.. 그래도 뒤끝이…머쓱 머쓱.
후리자님도 디버깅을 할 환경이 안되서 못고치고 있는 것 같은데. 개발자는 에러를 재현할 수 있어야 디버깅 할 수 있는 것 아닌가…
적용예
-
// stltest.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
-
//
-
-
#include “stdafx.h”
-
-
#include <vector>
-
#include <algorithm>
-
#include <math.h>
-
-
// 테스트 데이터를 담고 있는 구조체
-
struct test
-
{
-
int idx;
-
float v1;
-
float v2;
-
float v3;
-
};
-
-
// remove_if의 조건문에 해당하는 함수
-
bool isgood(test t)
-
{
-
if(t.v1 + t.v2 + t.v3 < 180)
-
{
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
-
// find_if의 조건문에 해당하는 함수
-
bool findme(test t)
-
{
-
if(t.idx == 99)
-
{
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
-
//
-
bool sortrule(const test& a1, const test& a2)
-
{
-
// return a1.idx < a2.idx;
-
return sqrt(a1.v1 * a1.v1 + a1.v2 * a1.v2 + a1.v3 * a1.v3) < sqrt(a2.v1 * a2.v1 + a2.v2 * a2.v2 + a2.v3 *a2.v3 );
-
}
-
-
void printvalues(std::vector<test>& tests)
-
{
-
char str[80];
-
std::vector<test>::iterator itr;
-
-
// 값출력
-
printf(“값출력 size of vector is %d\n“, tests.size());
-
for(itr = tests.begin(); itr != tests.end(); itr++)
-
{
-
sprintf(str, “%d\t%3.3f\t%3.3f\t%3.3f\n“, itr->idx, itr->v1, itr->v2, itr->v3);
-
printf( str );
-
}
-
}
-
-
int _tmain(int argc, _TCHAR* argv[])
-
{
-
std::vector<test> tests;
-
std::vector<test>::iterator itr;
-
-
// 01. 값설정 –> push_back()을 사용한다.
-
for(float i=0; i < 10; i++)
-
{
-
test t;
-
t.idx = (int)i;
-
t.v1 = 10.0f * i;
-
t.v2 = 20.0f * i;
-
t.v3 = 30.0f * i;
-
-
tests.push_back(t);
-
}
-
printvalues(tests);
-
-
// 임의로 뒤집기
-
random_shuffle(tests.begin(), tests.end());
-
-
// 02. 조건에 맞는 놈 지우기 –> remove_if()를 사용한다.
-
tests.erase(remove_if(tests.begin(), tests.end(), isgood), tests.end());
-
printvalues(tests); // 값보자..
-
-
// 03. 원하는 위치에 몇 놈집어넣기 –> insert()를 사용해서..
-
test t = { 99, 444.0f, 555.0f, 666.0f};
-
tests.insert(tests.begin()+4, t);
-
printvalues(tests);
-
-
// 04. 바꾸기를 해보자 –>
-
test t2 = { 199, 444.0f, 555.0f, 666.0f};
-
itr = find_if(tests.begin(), tests.end(), findme); // 이 놈을 찾아서
-
tests.erase(itr); // 지우고
-
tests.insert(itr, t2); // 그자리에 다른 놈을 넣어준 다음에
-
printvalues(tests);
-
-
// 05. sort를 해보자
-
printf(“sort\n“);
-
sort(tests.begin(), tests.end(),sortrule);
-
printvalues(tests);
-
-
/*
-
-
-
// 해당위치에 삽입하기
-
test t;
-
t.idx = (int)i;
-
t.v1 = 10.0f * i;
-
t.v2 = 20.0f * i;
-
t.v3 = 30.0f * i;
-
-
// tests.insert()
-
*/
-
-
return 0;
-
}
-
-
비주얼 스튜디오를 이용하여 nVidia Cg를 프로그래밍 할 때, 쉐이더인 Cg파일은 비주얼 스튜디오가 일반 텍스트 파일로 인식해서 Cg의 여러 키워드 들이 그냥 까만 글자로 나온다.
이미 좋은 툴에 익숙해진 눈과 머리인지라 흰 바탕에 까만 글씨만 써있는 코드를 보면 머리가 멍해지는 개발자가 다수일 것이다.

[2007/7/3] 이것 저것 쓰는 것들이 많아서 하나의 버전으로 통합했다.
그래서 비주얼 스튜디오에서 Cg를 사용하면서 Syntax Highlight를 사용하려면 다음과 같은 절차를 거치면 된다.
먼저 다운로드…
syntaxhighlight.zip
비주얼 스튜디오 6의 경우
1. 첨부된 파일 중에서 usertype.dat 파일을
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin 이 위치에 복사한다.
2. 첨부파일 안에 있는 install_highlighting.reg 파일을 더블 클릭에서 레지스트리에 등록시킨다.
비주얼 스튜디오 .2003의 경우
1. 첨부된 파일 중에서 usertype.dat 파일을
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE 이 위치에 복사한다.
2. 첨부파일 안에 있는 install_highlighting_vs7.reg 파일을 더블 클릭해서 레지스트리에 등록시킨다.