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;
}