2015-10-19 3 views
1

Мне нужно создать небольшую игру с использованием OpenGL и C++. Я использую this учебник для начала работы (моя цель - не создавать игру, а использовать код, который я в конечном итоге создаю).Проблемы, связанные с учебным пособием по C++/OpenGL (импорт изображений)

Я закончил видео 8 (один связал), но я столкнулся с проблемой. Мой код разбился на линии

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

Wen меняет параметры метода loadAndBufferImage к чему-то случайному (hgsjrkbgfdkj работает отлично) код не рухнет, но, очевидно, не загружайте изображения. Я не уверен, что я ошибаюсь. Моя IDE выдает предупреждение в строке glfwReadImage, так как переменная 3 не имеет значения NULL (хотя она отлично работает с этой строкой).

glfwReadImage(fileName, &imageData, NULL); 

Я не уверен, что я пропустил/делаю неправильно. Это может быть образ? Я использовал один конвертированный по ссылке, приведенной в описании видео. Единственный hing, который я не делал в видео, - это небольшая часть импорта изображений около 7,40. Я использую NetBeans, а не XCode, и я просто импортировал файл rocket.tga в папку ресурсов (щелкните правой кнопкой мыши o папку ресурсов, добавьте существующий элемент, добавленное изображение).

Вот полная копия моего 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, потому что я не мог заставить новые работать. Еще раз, не очень уместно, хотя я думаю.

+0

Вы уверены, что формат изображения, возвращенный ['glfwReadImage()'] (http://www.glfw.org/GLFWReference27.pdf), на самом деле является RGBA? Если это не так, помните, что ['glTexImage2D()'] (https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml) может принимать один из следующих форматов, а не 'GL_RGBA':' GL_ALPHA, GL_LUMINANCE', 'GL_LUMINANCE_ALPHA',' GL_RGB' – 865719

+0

Почему вы не используете 'imageData.Format' для параметра' format' вашего вызова 'glTexImage2D()'? – genpfault

ответ

1

Использование imageData.Format для format в 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 и вы лежите и сказать, что это GL_RGBA вместо OpenGL тогда будет счастливо read right off the end of imageData.Data ищет RGBA кортежей, которые не существуют.

+0

Привет. Этот ответ/изменение верны. Моя проблема теперь решена. Почему раньше я не использовал правильный синтаксис? Я подумаю, что это недостаток опыта и/или знаний. Я начал этот проект сегодня утром, и я по-прежнему очень шаткий по определенному числу тем. Я, очевидно, попытался прочитать/исправить/отладить и т. Д., Но я не мог прийти к выводу. Хотя учебник хорош в целом, я уже нашел некоторые проблемы в течение восьми эпизодов, которые я закончил. Большое спасибо за вашу помощь!! : D –

Смежные вопросы