C ++ / OpenGL教程后的问题(导入图像)

时间:2015-10-19 17:48:37

标签: c++ opengl glfw

我需要使用OpenGL和C ++创建一个小游戏。我正在使用this教程开始(我的目标实际上不是创建游戏,而是使用我最终创建的代码)。

我完成了视频8(链接的那个),但我遇到了问题。我的代码崩溃了

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageData.Width, imageData.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData.Data);

我将loadAndBufferImage方法参数更改为随机的(hgsjrkbgfdkj工作正常)代码不会崩溃,但显然它不会加载任何图像。我不确定我错了什么。我的IDE在glfwReadImage行上发出警告,因为它不喜欢变量3为NULL(尽管它完全运行该行)。

glfwReadImage(fileName, &imageData, NULL);

我不确定我错过了什么/做错了什么。这可能是形象吗?我使用了一个通过视频描述中提供的链接进行转换。我在视频中没有做过的唯一一个是7.40左右的小图像导入部分。我使用NetBeans而不是XCode,我刚刚在我的资源文件夹中导入了rocket.tga文件(右键单击o resources文件夹,添加现有项目,添加图像)。

到目前为止,这是我的GameWindow.cpp代码的完整副本

#define GLEW_STATIC
#include "GameWindow.h"
#define GL_GLEXT_PROTOTYPES

#include <iostream>

typedef struct {
    GLfloat positionCoordinates[3];
    GLfloat textureCoordinates[2];
} VertexData;

#define Square_Size 100

VertexData vertices[] = {
    {{0.0f, 0.0f, 0.0f},{0.0f,0.0f}},
    {{Square_Size, 0.0f, 0.0f}, {1.0f,0.0f}},
    {{Square_Size, Square_Size, 0.0f}, {1.0f,1.0f}},
    {{0.0f, Square_Size, 0.0f}, {0.0f,1.0f}}
};

void GameWindow::setRunning(bool newRunning) {
    _running = newRunning;
}

bool GameWindow::getRunning() {
    return _running;
}

GLuint GameWindow::loadAndBufferImage(const char *fileName){
    GLFWimage imageData;
    glfwReadImage(fileName, &imageData, NULL);

    GLuint textureBufferID;

    glGenTextures(1, &textureBufferID);
    glBindTexture(GL_TEXTURE_2D, textureBufferID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageData.Width, imageData.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData.Data);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glfwFreeImage(&imageData);

    return textureBufferID;
}

GameWindow::GameWindow(bool running):_running(running), _height(800), _width(800*16/9) {
    glClearColor(1.0f,1.0f,1.0f,1.0f);
    glViewport(0.0f, 0.0f, _width, _height);

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0,_width,0,_height);
    glMatrixMode(GL_MODELVIEW);

    glGenBuffers(1, &_vertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(VertexData), (GLvoid *) offsetof(VertexData,positionCoordinates));
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(VertexData), (GLvoid *) offsetof(VertexData, textureCoordinates));

    _textureBufferID = loadAndBufferImage("rocket.tga");
}

void GameWindow::render() {
    glClear(GL_COLOR_BUFFER_BIT);

    glDrawArrays(GL_QUADS, 0, 4);

    glfwSwapBuffers();
}

void GameWindow::update() {

}

我认为我使用的是旧版GLFW。在2.7版本左右,因为我无法让新的工作。再一次,虽然我认为并不是真的相关。

1 个答案:

答案 0 :(得分:1)

imageData.Format中使用format {/ 1}}:

glTexImage2D()

否则,如果glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, imageData.Width, imageData.Height, 0, imageData.Format, // instead of GL_RGBA GL_UNSIGNED_BYTE, imageData.Data ); 而你撒谎并说出imageData.Format == GL_RGB,那么OpenGL将很乐意read right off the end of imageData.Data寻找那些不存在的RGBA元组。