freegultを使ってみたのですが、上手く表示されません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
grayf
記事: 10
登録日時: 11年前

freegultを使ってみたのですが、上手く表示されません。

#1

投稿記事 by grayf » 11年前

こんにちは。今回は、前々からやろうと思っていたOpenGLとfreegultとglpngを使ってみました。
OpenGLプログラミングメモ( http://www21.atwiki.jp/opengl/pages/24.html )のソースをコピペして
実行したところ最低限使いたい機能(平面図形描画、 文字列描画(出来たことにはできましたが全然理解できませんでした)、マウスの状態取得、png画像表示、タイマー機能)を使うことはできたのですが、併用したところ文字列のみが正常に表示され、平面図形と用意したpngの画像は黒く塗り潰されたように表示されてしまいました。考えられる原因をご教授願います。
IDEはVisual Stdio Express 2013 for Windows desktop、OSはWindows 8.1、使ったライブラリは最新のバージョンを使いました。

コード:

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")

#include <GL/freeglut.h>
#include <GL/glpng.h>
#include <stdlib.h>
#include <string>
#include <math.h>

using namespace std;

wstring wstr = L"";
wchar_t buf[255];

GLfloat top = -0.9;

pngInfo info;
GLuint texture;

#define WIDTH 640
#define HEIGHT 480
#define Pai 3.1415926

int MouseX, MouseY;
bool M_left = false;
bool M_right = false;
bool M_middle = false;

class Color{
public:
	GLfloat a;
	GLfloat b;
	GLfloat c;
	GLfloat d;

	void ColorSet(GLfloat o, GLfloat p, GLfloat q, GLfloat r){
		a = o / 225;
		b = p / 225;
		c = q / 225;
		d = r;
	}
};

Color blue;

void Square2D(int x1, int y1, int x2, int y2, float size, bool flag, Color c){
	glLineWidth(size);//線の太さ
	if (flag == false)glBegin(GL_LINE_LOOP);
	else glBegin(GL_QUADS);
	glVertex2i(x1, y1);
	glVertex2i(x2, y1);
	glVertex2i(x2, y2);
	glVertex2i(x1, y2);
	glEnd();
}

void Line2D(int x1, int y1, int x2, int y2, float size, Color c){
	glColor4f(c.a, c.b, c.c, c.d);
	glLineWidth(size);//線の太さ
	glBegin(GL_LINES);
	glVertex2i(x1, y1);
	glVertex2i(x2, y2);
	glEnd();
}

class GLFONT
{
public:
	HFONT Hfont;
	HDC Hdc;
	GLFONT(wchar_t *fontname, int size);
	void DrawStringW(Color c, int x, int y, wchar_t *format, ...);
};

//コンストラクタ フォント作成
GLFONT::GLFONT(wchar_t *fontname, int size)
{
	Hfont = CreateFontW(
		size,      //フォント高さ
		0,       //文字幅
		0,       //テキストの角度
		0,       //ベースラインとx軸との角度
		FW_REGULAR,     //フォントの太さ
		FALSE,      //イタリック体
		FALSE,      //アンダーライン
		FALSE,      //打ち消し線
		SHIFTJIS_CHARSET,   //文字セット
		OUT_DEFAULT_PRECIS,   //出力精度
		CLIP_DEFAULT_PRECIS,  //クリッピング精度
		ANTIALIASED_QUALITY,  //出力品質
		FIXED_PITCH | FF_MODERN, //ピッチとファミリー
		fontname);     //書体名

	Hdc = wglGetCurrentDC();
	SelectObject(Hdc, Hfont);
}

//ワイド文字列の描画
void GLFONT::DrawStringW(Color c, int x, int y, wchar_t *format, ...){
	wchar_t buf[256];
	va_list ap;
	int Length = 0;
	int list = 0;
	glColor4f(c.a, c.b, c.c, c.d);
	//ポインタがNULLの場合は終了
	if (format == NULL)
		return;
//文字列変換
	va_start(ap, format);
	vswprintf_s(buf, format, ap);
	va_end(ap);
	Length = wcslen(buf);
	list = glGenLists(Length);
	for (int i = 0; i<Length; i++){
		wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i);	}
	glDisable(GL_LIGHTING);
	glRasterPos2i(x, y);
	//ディスプレイリストで描画
	for (int i = 0; i<Length; i++)
	{	glCallList(list + i);}
	glEnable(GL_LIGHTING);
	//ディスプレイリスト破棄
	glDeleteLists(list, Length);
	list = 0;
	Length = 0;
}

GLFONT *font;

//マウス(クリック)
void mouse(int button, int state, int x, int y){
	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
	{
		M_left = true;
	}
	else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
	{
		M_left = false;
	}
	if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
	{
		M_right = true;
	}
	else if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
	{
		M_right = false;
	}
	if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
	{
		M_middle = true;
	}
	else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_UP)
	{
		M_middle = false;
	}
}
//パッシブ
void passive(int x, int y)
{	MouseX = x;
	MouseY = y;}

void timer(int value) {
	static GLboolean isUp = GL_TRUE;
	if (top > 0.9F) isUp = GL_FALSE;
	else if (top <= -0.9F) isUp = GL_TRUE;
	top += (isUp == GL_TRUE ? 0.01 : -0.01);//三項演算子
	glutPostRedisplay();
	glutTimerFunc(50, timer, 0);
}

void display(void)
{	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0);
	glEnable(GL_TEXTURE_2D);//テクスチャ有効
	glEnable(GL_ALPHA_TEST);//アルファテスト開始
	glBegin(GL_POLYGON);
	glTexCoord2f(0.0f, 1.0f); glVertex2d(10, 430);//左下
	glTexCoord2f(0.0f, 0.0f); glVertex2d(10, 250);//左上
	glTexCoord2f(1.0f, 0.0f); glVertex2d(310, 250);//右上
	glTexCoord2f(1.0f, 1.0f); glVertex2d(310, 430);//右下
	glEnd();
	glDisable(GL_ALPHA_TEST);//アルファテスト終了
	glDisable(GL_TEXTURE_2D);//テクスチャ無効
	wstr = L"マウス位置 X:";
	_itow_s(MouseX, buf, 10);
	wstr += buf;
	wstr += L" Y:";
	_itow_s(MouseY, buf, 10);
	wstr += buf;
	font->DrawStringW(blue, 10, 30, (wchar_t *)wstr.c_str());
	wstr = L"押されているボタン:";
	if (M_left)wstr += L"左 ";
	if (M_middle)wstr += L"中 ";
	if (M_right)wstr += L"右 ";
	font->DrawStringW(blue, 10, 60, (wchar_t *)wstr.c_str());
	Square2D(5, 100, 200, 300, 2,true, blue);
	glutSwapBuffers();
}

void Init(){
	glutDisplayFunc(display);
	glutMouseFunc(mouse);
	glutPassiveMotionFunc(passive);
	glFlush();
	glClearColor(1.0, 1.0, 1.0, 1.0);
	font = new GLFONT(L"MS明朝", 24);
	texture = pngBind("sample.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
}
int main(int argc, char *argv[])
{
	blue.ColorSet(2, 2, 225, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutCreateWindow("テスト");
	do{glutTimerFunc(100, timer, 0);
		Init();
		glutMainLoop();
	} while (1 == 1);
	delete font;
	return 0;
}

grayf
記事: 10
登録日時: 11年前

Re: freegultを使ってみたのですが、上手く表示されません。

#2

投稿記事 by grayf » 11年前

自己解決しました。
問題は、glEnable(GL_LIGHTING);
だったという如何にも初歩的なつまずきでした。

閉鎖

“C言語何でも質問掲示板” へ戻る