1

私はEclipse、MinGWを使用しており、freeglutとglewをコンパイルして、それらのライブラリ、DLL、およびヘッダーファイルを適切な場所(MinGW / include / GL、MinGW / lib、Windows / SysWOW64)にコピーしました。また、Eclipseのライブラリ(freeglut64、opengl32、glew32、glu32)をMinGWC++リンカーの下でリンクしました。これが私のコードです...

--CharGame.cpp--
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include "CharGame.h"
#define WINDOW_TITLE "CharGame"

int CurrentWidth = 800,
    CurrentHeight = 600,
    WindowHandle = 0;
unsigned FrameCount = 0;
GLuint VertexShaderId,
    FragmentShaderId,
    ProgramId,
    VaoId,
    VboId,
    ColorBufferId;

int main(int argc, char* argv[]) {
    Initialize(argc, argv);
    glutMainLoop();
    exit(EXIT_SUCCESS);
}
const GLchar* VertexShader =
{
    "#version 400\n"\

    "layout(location=0) in vec4 in_Position;\n"\
    "layout(location=1) in vec4 in_Color;\n"\
    "out vec4 ex_Color;\n"\

    "void main(void)\n"\
    "{\n"\
    "   gl_Position = in_Position;\n"\
    "   ex_Color = in_Color;\n"\
    "}\n"
};
const GLchar* FragmentShader =
{
    "#version 400\n"\

    "in vec4 ex_Color;\n"\
    "out vec4 out_Color;\n"\

    "void main(void)\n"\
    "{\n"\
    "   out_Color = ex_Color;\n"\
    "}\n"
};

void Initialize(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitContextVersion(4, 0);
    glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
    glutInitWindowSize(CurrentWidth, CurrentHeight);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    WindowHandle = glutCreateWindow(WINDOW_TITLE);
    if (WindowHandle < 1) {
        fprintf(stderr, "Error: Could not create a render window.\n");
        exit(EXIT_FAILURE);
    }
    glutReshapeFunc(Resize);
    glutDisplayFunc(Render);
    glutIdleFunc(Idle);
    glutTimerFunc(0, Timer, 0);

    fprintf(stdout, "Info: OpenGL Version: %s\n", glGetString(GL_VERSION));
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

}

void Resize(int width, int height) {
    CurrentHeight = height;
    CurrentWidth = width;
    glViewport(0, 0, CurrentWidth, CurrentHeight);
}

void Render(void) {
    ++FrameCount;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glutSwapBuffers();
    glutPostRedisplay();
}

void Idle(void) {
    glutPostRedisplay();
}

void Timer(int value) {
    if (0 != value) {
        char* TempString = (char*) malloc(512 + strlen(WINDOW_TITLE));
        sprintf(TempString, "%s: %d Frames Per Second @ %d x %d", WINDOW_TITLE, FrameCount*4, CurrentWidth, CurrentHeight);
        glutSetWindowTitle(TempString);
        free(TempString);
    }
    FrameCount = 0;
    glutTimerFunc(250, Timer, 1);
}
--End CharGame.cpp--

--CharGame.h--
#ifndef CHARGAME_H_
#define CHARGAME_H_

void Initialize(int, char*[]);
void InitWindow(int, char*[]);
void Resize(int,int);
void Render(void);
void Timer(int);
void Idle(void);

#endif
--End CharGame.h--

私はすべてを正しく行ったと思いますが、EclipseはVertexShaderとFragmentShaderで「タイプ'GLchar'を解決できませんでした」というエラーをスローします。コードを間違えたり、必要な手順を見逃したりしましたか?

4

2 に答える 2

2

文字列定数を正しい方法で宣言していません。中かっこは必要ありません。また、文字列の間に空の行がないか注意してください。文字列を削除するか(以下を参照)、そこに「\」を追加してください。

「glew.h」の前に「GL/GL.h」ファイルを含めます。これも役立つ場合があります。

これを通常の文字で使用します。

const char* VertexShader =
"#version 400\n"\
"layout(location=0) in vec4 in_Position;\n"\
"layout(location=1) in vec4 in_Color;\n"\
"out vec4 ex_Color;\n"\
"void main(void)\n"\
"{\n"\
"   gl_Position = in_Position;\n"\
"   ex_Color = in_Color;\n"\
"}\n";

const char* FragmentShader =
"#version 400\n"\
"in vec4 ex_Color;\n"\
"out vec4 out_Color;\n"\
"void main(void)\n"\
"{\n"\
"   out_Color = ex_Color;\n"\
"}\n";
于 2012-06-04T18:14:43.637 に答える
1

これは、別の回答に対する私のコメントを拡張したものです。

const char* VertexShader =
R"(#version 400
layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;
void main(void)
{
   gl_Position = in_Position;
   ex_Color = in_Color;
}
)";
于 2012-06-04T18:41:45.970 に答える