2014-12-08 2 views
-2

У меня есть простой вопрос OPENGL, в настоящее время я пытаюсь научиться текстурирования и вот часть I`m запутался об этом:OPENGL текстуры процесс инициализации

void initTextures() 
{ 
    GLuint gTextureSphere; 
    int width, height, channels = 1; 
    unsigned char* textureMapData = SOIL_load_image("res/texturemap.jpg", &width, &height, 0, SOIL_LOAD_RGB); 

    //texture map 
    glGenTextures(1,&gTextureSphere); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D,gTextureSphere); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureMapData); 

    SOIL_free_image_data(textureMapData); 
    glUniform1i(glGetUniformLocation(gProgramSphere, "normalTexture"), 0); 
    //////////////////////// 

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

Я думаю, что код выше читает мой образ " texturemap.jpg "на SOIL_load_image и сохраните его на textureMapData переменной. Теперь я хочу знать это, какова цель следующих 4 строк. Я имею в виду, я уже прочитал данные. Я помещаю эти данные в переменную gTextureSphere с этими следующими 4 строками? Я думаю, это невозможно, так как gTextureSphere является переменной типа GLuint. Может ли кто-нибудь объяснить мне?

+1

gTextureSphere - это РУЧКА для вашей текстуры. Эти четыре строки создают новую текстуру и загружают данные из ОЗУ в память графического процессора. – BDL

+0

@BDL благодарит за ответ, что вы хотите сказать HANDLE? и еще один вопрос, после этих строк, если я хочу получить доступ к моей текстуре, следует ли мне перечислить переменную gTextureSphere? –

+0

Каждый объект opengl задается с помощью дескриптора. Это всего лишь целое число, идентифицирующее объект. Вы получаете доступ к текстурам, используя соответствующие функции OpenGL, и вы должны обязательно прочитать вводный учебник для OpenGL. – BDL

ответ

1

Теперь, я хочу знать, что является целью следующих четырех линий.

До сих пор данные текстуры загружались только в адресное пространство программы. Но OpenGL API-интерфейс рендеринга не «волшебным образом» узнает о доступности этих данных. Давайте сломаем его:

Сначала создайте дескриптор OpenGL, с которым мы разговариваем с OpenGL, чтобы он знал, что объект текстуры, о котором мы говорим. Сгенерированный дескриптор будет сохранен в переменной gTextureSphere.

glGenTextures(1,&gTextureSphere); 

OpenGL имеет несколько «пробки», называемые текстурных блоков, в котором объекты текстуры могут быть «соединены». Это говорит OpenGL, что следующие операции должны происходить на текстурном блоке 0 (GL_TEXTURE0):

glActiveTexture(GL_TEXTURE0); 

Следующих сделать связь между только выбранным блоком текстуры и текстурой объектом мы, и OpenGL вступил в соглашение позвонить по значение, содержащееся в переменной gTextureSphere.

glBindTexture(GL_TEXTURE_2D,gTextureSphere); 

Теперь, когда OpenGL знает, что мы говорим о блоке 0 текстуры и определенной текстуры быть подключен к нему, мы можем сказать ему, чтобы делать определенные вещи с объектом текстуры. Например, скопируйте данные изображения, прочитайте их из файла и расшифруйте в некоторый буфер.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureMapData); 

В данный момент OpenGL имеет объект текстуры с рабочей копией данных изображения; теперь мы можем безопасно освободить буфер, который мы использовали для декодирования файла изображения, поскольку у OpenGL теперь есть своя копия.

+0

замечательное объяснение, я действительно ценю, так как вы не только понизили, но и дали удовлетворительное объяснение. –

+0

@kemalgunes: На самом деле я даже дал вам эту возможность. Я не думаю, что ваш вопрос был в любом случае плохим. (Нет глупых вопросов, но многие вопросы плохо изучены, но ваш был полностью действителен). – datenwolf

+0

oki doki. Кстати, у меня есть еще один вопрос. Как вы знаете, мы можем получить доступ к декартовым координатам вершины в glsl-части с переменной gl_position, есть ли какая-либо подобная переменная, которая может быть использована для доступа к координатам u-v одной вершины в glsl? –

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