OpenGL (590レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
262: 名前は開発中のものです。 [sage] 2005/10/09(日) 04:07:25 ID:qOVsvncy(1/7) AAS
SDLとOpenGLの勉強を先日から初めて、とりあえずテクスチャを貼り付けてみようと思いました。
が、なかなかうまくいきません。
以下少し長いですがソースを貼り付けてみますので、おかしい点があれば
教えていただけないでしょうか?
/* テクスチャの練習 */
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdio.h>
#include <stdlib.h>
GLuint texName;
static void process_events(void)
{
SDL_Event event;
/* この中でやってきたイベントごとの処理を書く */
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
exit(0);
}
}
}
263: 名前は開発中のものです。 [sage] 2005/10/09(日) 04:12:43 ID:qOVsvncy(2/7) AAS
static void draw_screen(void)
{
static GLfloat v0[] = { -1.0f, -1.0f, 1.0f };
static GLfloat v1[] = { 1.0f, -1.0f, 1.0f };
static GLfloat v2[] = { 1.0f, 1.0f, 1.0f };
static GLfloat v3[] = { -1.0f, 1.0f, 1.0f };
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -5, 5, 0, 0, 0, 0, 0, 10);
/* 何番のテクスチャを使うか */
glBindTexture(GL_TEXTURE_2D, texName);
/* 四角形を表示 */
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3fv(v0);
glTexCoord2f(1,0);glVertex3fv(v1);
glTexCoord2f(1,1);glVertex3fv(v2);
glTexCoord2f(0,1);glVertex3fv(v3);
glEnd();
/* フロントバッファとバックバッファの交換 */
SDL_GL_SwapBuffers();
}
264: 名前は開発中のものです。 [sage] 2005/10/09(日) 04:14:06 ID:qOVsvncy(3/7) AAS
static void setup_opengl(int width, int height)
{
float ratio = (float) width / (float) height;
SDL_Surface *image; /* テクスチャ用画像 */
SDL_Surface *tmpImage;
/* 消去時の色を黒にセット */
glClearColor(0, 0, 0, 0);
/* ビューポートをウィンドウサイズに設定 */
glViewport(0, 0, width, height);
/* 射影変換(縦の視野角が60.0度、横の視野角は縦横比があうように設定) */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, ratio, 1.0, 1024.0);
/* テクスチャ用画像読み込み */
image = IMG_Load("tile.png");
if(!image) exit(-1);
tmpImage = SDL_CreateRGBSurface(SDL_SWSURFACE,0,0,32,
0x000000ff,0x0000ff00,0x00ff0000,0xff000000);
image = SDL_ConvertSurface(image, tmpImage->format, SDL_SWSURFACE);
SDL_FreeSurface(tmpImage);
/* テクスチャの設定 */
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &texName); /* 識別用コードの取得(再利用時に必要) */
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image->w, image->h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
SDL_FreeSurface(image); /* テクスチャに転送した時点で必要なし */
}
265: 名前は開発中のものです。 [sage] 2005/10/09(日) 04:14:58 ID:qOVsvncy(4/7) AAS
int main(int argc, char *argv[])
{
const SDL_VideoInfo *info; /* ビデオ情報格納用 */
int width, height; /* ウィンドウサイズ */
int bpp; /* 色深度 */
/* SDLの初期化 */
if(SDL_Init(SDL_INIT_VIDEO) < 0){
fprintf(stderr, "SDLの初期化に失敗しました: %s\n", SDL_GetError());
return -1;
}
/* 強制終了時SDLの後片付けを忘れないために */
atexit(SDL_Quit);
/* ここからウィンドウ作成のためのあれこれ */
/* ビデオ情報の取得 */
info = SDL_GetVideoInfo();
if(!info){
fprintf(stderr, "ビデオ情報の取得に失敗しました: %s\n", SDL_GetError());
exit(-1);
}
/* ウィンドウサイズと色深度の指定 */
width = 640;
height = 480;
bpp = info->vfmt->BitsPerPixel;
266: 名前は開発中のものです。 [sage] 2005/10/09(日) 04:16:33 ID:qOVsvncy(5/7) AAS
/* OpenGL用の属性を指定 */
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
/* ビデオモードの設定 最後の引数がSDL_OPENGLであることに注意 */
if(SDL_SetVideoMode(width, height, bpp, SDL_OPENGL) == 0){
fprintf(stderr, "ビデオモードの設定に失敗しました: %s\n", SDL_GetError());
exit(-1);
}
/* OpenGL用の細かい初期設定はこの関数の中で */
setup_opengl(width, height);
/* メインループ */
while(1){
/* イベントを処理 */
process_events();
/* 画面を表示 */
draw_screen();
}
}
267: 名前は開発中のものです。 [sage] 2005/10/09(日) 08:57:23 ID:qOVsvncy(6/7) AAS
以上です。
tile.pngは一色に塗りつぶした24*24の24bitカラーの画像です。
とりあえず斜め上から見下ろした白い面なら見えるのですが……。
269: 名前は開発中のものです。 [sage] 2005/10/09(日) 12:05:18 ID:qOVsvncy(7/7) AAS
>>268
ご親切にありがとうございます。
原因は24を2のn乗であらわせると思い込んでたことでした。
お恥ずかしい限りです。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.030s