SDL 다룰줄 아시는 분 도와주세요=;
글쓴이: hyangii / 작성시간: 일, 2003/08/31 - 2:48오후
안녕하세요.
제가 하고자 하는것은 SDL로 쓰레드를 생성해서 랜덤한 수를 공급하고요
그 수를 높이 수치로 받아서 높이가 변화하는 사각형을 opengl로 써서
구현하는 것입니다.
SDL을 안끌어들여도 지장은 없지만, 더블버퍼링을 해도 깜빡거림이 없어지지
않아서, 건드리게 됐는데, 컴파일 & 실행이 안되고, 주위를 인터넷을 찾아도,,
원하는걸 찾기가 힘드네요(기초적인 부분을 몰라서리 -_ㅠ);;
우선 사용되는 헤더파일들은
#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <SDL/SDL.h> #include <SDL/SDL_thread.h> #include <time.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h>
이고,
쓰레드를 만들어서 그리는 함수는
int worker_func(void *data) { while (thread_control == GO) { int bucket; SDL_mutexP(mutex); for (bucket = 0 ; bucket <512; bucket++) { srand(time(NULL)); int n,m; m=rand(); n=(m%512)+1; freq[bucket]=n; } SDL_mutexV(mutex); //랜덤수를 잡아 freq에 저장 int h; SDL_mutexP(mutex); h= freq[0]; // h에는 계속 랜덤수가 저장 SDL_mutexV(mutex); SDL_SetVideoMode(480,320,32,SDL_OPENGL); gluLookAt(0,0,5,0,0,0,0,1,0); glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); static float rotation = 0; float height, color1,color2,color3; // h를 이용해 높이, 색등을 지정. height=h/1024.0; color1=h/512.0; color2=h/2048.0; color3=h/1024.0; glRotatef(rotation++,0,0,1); glBegin(GL_POLYGON); //사각형 구현 부분 glColor3f(color3,0.0f,color1); glVertex3f(-0.5f,-0.5f,0.0f); glColor3f(color2,0.0f,0.0f); glVertex3f(0.5f,-0.5f,0.0f); glColor3f(0.0f,0.0f,color3); glVertex3f(0.5f,height,0.0f); glColor3f(color1,color2,color3); glVertex3f(-0.5f,height,0.0f); glEnd(); SDL_GL_SwapBuffers(); rotation+=1.0f; if(rotation>359) rotation=1.0f; } }
이것 입니다...
그리고 메인 함수는
int main(int argc, char **argv) { Init(); // 랜덤 수를 발생하게 쓰레드를 설정해주는 함수 SDL_Init(SDL_INIT_VIDEO); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); worker_func(worker_thread); // 어떻게 해야할지 모르는 부분 !! glutReshapeFunc(changeSize); glEnable(GL_DEPTH_TEST); glutMainLoop(); Cleanup(); return 0; }
입니다..
컴파일은 g++ mutex2.c -lSDL -lGL -lGLU -lglut -lpthread
로 했습니다.
worker_func함수를 불러와야 하는데, 컴파일을 하면 세그멘테이션 오류'가
뜨네요.
전체 코드를 첨부 시켰습니다... 대략 100라인 -_-;;
어떻게 해결할 수 있을까요, 조언 부탁드립니다...
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 2.57 KB |
![]() | 3.09 KB |
Forums:
...
제가 생각할 때 이상한 부분이 2가지입니다.
우선 첫번째는 단순히 glut에서 생성한 윈도가 sdl에서 제대로 붙나요?
(전 윈도 vc++7에서)전 차라리 sdl만으로 수정했습니다.
그리고 쓰레드에서는 값만 변경하시는 편이 좋지 않을까요?
수정한 화일을 첨부합니다.
아참. 그런데 매번 렌더링 할때마다 SDL_SetVideoMode()을 호출하는건 왜지요? 없으면 렌더링이 안되더군요.
----
The future is here. It's just not widely distributed yet.
- William Gibson
수정 감사합니다.
에.. 님께서 이상하다 말하신 부분들이.. 어떤부분이 어떻게 이상하게 돌아가는지
잘 모릅니다.. xmms의 시각화 플러그인 메뉴얼을 보고 허접으로 스스슥
짰기때문에ㅣ...
이렇게 수정해주신거 감사합니다.
다만... 리눅스에서 컴파일 해서 그런지 몇가지 문제가 떴습니다.
gcc mutex3.cpp -lSDL -lGL -lGLU -lGLU -lglut -lpthread
이렇게 컴파일했습니다만,
처음에는 SDL_Delay(0.1f); 부분이 에러가 났는데요
원레 인자가 unsigned int 여야 한다면서 컴팔이 안되더군요
그래서 아예 '1'로 수정했습니다.
그랬더니 에러메세지 없이 컴파일은 됐습니다만,
화면이 초기화 되고, 윈도우도 생성되는데,
화면에 아무것도 뿌려지지가 않네요.
조금만 더 도움을 주실수 있을까요 ;;;;;;;
printf or gdb
디버거를 사용하시면 디버거로 아니면 printf()등으로
worker_func(), render()가 계속해서 호출되는지를 보세요.
만약 render도 주기적으로 잘 호출되는데 역시 내용이 없다면 문제가 ;;;
제 경우엔 사각형 크기가 바뀌거나 하진 않습니다.
(역시 freq을 디버거나 printf등으로 실행시간에 살펴보세요. 저는 주욱 늘어날 뿐이더군요.)
----
The future is here. It's just not widely distributed yet.
- William Gibson
댓글 달기