Созданная вручную текстура показывает неожиданные результаты, OpenGLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Созданная вручную текстура показывает неожиданные результаты, OpenGL

Сообщение Anonymous »

Я пытаюсь создать данные текстуры вручную. Текстура проявляется неожиданным образом. Поэтому я разделил все на два простых случая для текстур 1x1 и 2x2. Когда я предоставляю текстуру 1x1, это нормально, но она не отображается нормально, когда я использую разные размеры, например 2x2. Все варианты показывают результаты, но не все в порядке.
При использовании текстуры 1x1 все в порядке:

Код: Выделить всё

unsigned char x1[1] = {255};
unsigned char x2[4] = {255, 0, 0, 255};
GLuint textureIDText = loadTextureFromData(1, 1, x1);
Отображается так, как и ожидалось:
Изображение

Когда я пробую текстуру 2x2, она показывает совершенно неожиданный результат:

Код: Выделить всё

unsigned char x1[1] = {255};
unsigned char x2[4] = {255, 0, 0, 255};
GLuint textureIDText = loadTextureFromData(2, 2, x2);
Вот результат, я ожидал бы здесь шахматную таблицу 2x2 или ее хорошее приближение:
Изображение

Когда я анимирую текстуру во время с циклом рендеринга та же история.

Текстура 1x1 анимируется нормально:

Код: Выделить всё

flushData(textureIDText, 1, 1, x1);
Текстура 2x2 анимируется с такими же неожиданными результатами:

Код: Выделить всё

flushData(textureIDText, 2, 2, x2);
Вот реализация loadTextureFromData:

Код: Выделить всё

unsigned int loadTextureFromData(int width, int height, void* pTextureData)
{
unsigned int textureID = 0;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, pTextureData);
glGenerateMipmap(GL_TEXTURE_2D);
return textureID;
}
А вот реализацияlushData:

Код: Выделить всё

void flushData(unsigned int textureID, int width, int height, void* pTextureData)
{
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, pTextureData);
glGenerateMipmap(GL_TEXTURE_2D);
}
Полный исходный код находится здесь:

Код: Выделить всё

#define _USE_MATH_DEFINES

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

using namespace std;

template class scope_guard
{
Deleter t;
public:
scope_guard(Deleter _t) :t(_t) {}
~scope_guard() { t();  }
};

const char* vertexShaderSource = R"glsl(#version 330 core
layout(location = 0) in vec3 aPos;
layout(location = 2) in vec2 aTexCoord;
out vec2 TexCoord;
void main()
{
gl_Position = vec4(aPos, 1.0);
TexCoord = aTexCoord;
})glsl";

const char* fragmentShaderSource = R"glsl(#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D ourTexture;
void main()
{
FragColor = vec4(texture(ourTexture, TexCoord).r, texture(ourTexture, TexCoord).r, texture(ourTexture, TexCoord).r, 1);
})glsl";

unsigned int loadTextureFromData(int width, int height, void* pTextureData)
{
unsigned int textureID = 0;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

/////////////////////////////////////
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, pTextureData);
glGenerateMipmap(GL_TEXTURE_2D);
return textureID;
}

void flushData(unsigned int textureID, int width, int height, void* pTextureData)
{
glBindTexture(GL_TEXTURE_2D, textureID);
//glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, i_width, i_height, 0, i_Type, GL_UNSIGNED_BYTE, i_TextureData);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, pTextureData);
glGenerateMipmap(GL_TEXTURE_2D);
}

GLFWwindow* appInit() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79789061/manually-generated-texture-shows-unexpected-results-opengl[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»