Мне нужно создать небольшую игру с использованием 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, потому что я не мог заставить новые работать. Еще раз, не очень уместно, хотя я думаю.
Вы уверены, что формат изображения, возвращенный ['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
Почему вы не используете 'imageData.Format' для параметра' format' вашего вызова 'glTexImage2D()'? – genpfault