Вопрос новичка в openGL - создание 1D текстуры? - PullRequest
1 голос
/ 31 мая 2011

РЕДАКТИРОВАТЬ

Хорошо, я добавил некоторые изменения в рендеринг текстур, и теперь я нахожусь в точке, которая выглядит не так, как я хочу, но перед тем, как пытаться изменитьвсе, что я просто хочу быть уверен, что я на правильном пути.Проблема, которую я пытаюсь решить: у меня 180000 вершин.Каждый из них может быть из одного из 190 «классов».Каждый класс может иметь свой цвет, назначенный в разное время.Итак, я пытаюсь создать текстуру с 190 цветами, и для каждой из 180000 вершин есть текстурное соответствие классу coresponding.Так для некоторого кода:

    self.bufferTextureIndex = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(textureIndexes), ADT.voidDataPointer(textureIndexes), GL_STATIC_DRAW_ARB)               

    self.texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_1D, self.texture)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)

Итак, textureIndexes - это массив чисел с плавающей точкой из [0..1].len (textureIndexes) - количество вершин, которые я использую (180000).Для текстуры textureArray содержит 190 * 3 плавающих ядра, соответствующих RBG цветов, которые я хочу для каждого класса.

Рисующая часть:

    glEnableClientState(GL_TEXTURE_COORD_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
    glTexCoordPointer(1, GL_FLOAT, 0, None);
    glBindTexture(GL_TEXTURE_1D, self.texture)
    glEnable(GL_TEXTURE_1D)       
    if type == GL_POINTS:
        glDrawArrays( GL_POINTS, 0, len(self.vertices) / 3 ); 
    else: 
        glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))

Так выглядит ли этот подход правильным?Результат не тот, который я ожидаю, но это может быть для выбранной мной цветовой кодификации, и я могу еще раз рассмотреть это, если основной подход будет хорошим.Я думаю, что, скорее всего, индексы построены неправильно.Для их построения у меня есть файл с числом от 0 до 190, соответствующий классу для каждого индекса.Таким образом, мое построение индекса до сих пор было просто читать index, а затем index / 190 для каждой вершины, чтобы получить число в [0..1]

EDIT2 Так что я воспользовался вашим советом, выполнил индекс+ 0,5 / 190 для генерации моих индексов.Я печатаю длину и значения массива индексов.Это 60000, и все числа от 0 до 1, в основном от 0,3 до 0,95.Но все же все мои вершины одного цвета.Так что единственное, что я не проверил, это 1D создание текстур.Может быть, вот где я ошибся:

    i = 0
    while i < 30:
        textureArray.append([1,0,0])
        i = i + 1
    while i < 60:
        textureArray.append([1,1,0])
        i = i + 1
    while i < 90:
        textureArray.append([1,1,1])
        i = i + 1
    while i < 120:
        textureArray.append([0,1,1])
        i = i + 1
    while i < 150:
        textureArray.append([0,0,1])
        i = i + 1
    while i < 190:
        i = i + 1 
        textureArray.append([0,0,0])

Так я генерирую свой массив текстур.Это будет не реальное решение, а по причинам тестирования.Так что моя текстура должна быть 1/6 красной - 1/6 ...Генерация текстуры, как указано выше:

    self.texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_1D, self.texture)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)

Правильно ли генерируется эта текстура?Потому что, хотя диапазон моих индексов такой же, как я упоминал ранее, все мои вершины имеют цвет самого первого цвета из текстуры.Забавно, что, если я «опущу» glBindBufferARB (GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex), сформирую чертеж и позволю нормали занять место текстурных индексов, я получу несколько разных цветов, но, похоже, текстурные индексы указывают на самый первый цветиз моей текстуры.Я загрузил два примера файлов с фактическими значениями textureIndices и normals.Понятия не имею, почему первый не работает, а второй, кажется, работает (не могу реально проверить, правильные ли они цвета, но, по крайней мере, они разные).http://www.megafileupload.com/en/file/315895/textureIndices-txt.html http://www.megafileupload.com/en/file/315894/normalsTest-txt.html

EDIT3

Так что теперь мои индексы работают.Вот пример изображения:

http://i.stack.imgur.com/yvlV3.png

Однако странная часть состоит в том, что, как вы можете видеть, границы не определены должным образом.Может ли это каким-либо образом повлиять на некоторые параметры, которые я передаю в текстуру, или я должен выполнить тройную проверку своего создания textureIndex?

1 Ответ

1 голос
/ 31 мая 2011
  1. В данный момент вы используете свои нормали в качестве координат текстуры, потому что self.bufferNormals был привязан при вызове glTexCoordPointer. 1D текстуры не только для цветов вершин. доступ к ним осуществляется с помощью текстурных координат для каждой вершины, таких как 2D-текстуры, в противном случае они будут бесполезной заменой цветов для каждой вершины. Прочтите некоторые вводные материалы по текстурированию или текстурированию OpenGL в целом, если вы этого не понимаете.

  2. Как сказано выше, определенно нет.

РЕДАКТИРОВАТЬ: В соответствии с вашим новым вопросом (тот, что на скриншоте), имейте в виду, что, когда вершины одного треугольника имеют разные текстурные координаты (в вашем случае они будут принадлежать к разным классам (что, я полагаю, не должно происходить), texCoords интерполируются по треугольнику и затем используются для получения цвета текстуры. Таким образом, вы должны убедиться, что все вершины треугольника имеют одинаковую texCoord, если вы не хотите, чтобы это произошло (что, я полагаю). Таким образом, вы должны дублировать вершины вдоль границ «класса материала». Возможно, вы могли бы получить быстрое и грязное решение, просто установив glShadeModel (GL_FLAT), но это также сгладит освещение и не будет определено, к какому классу относится граничный треугольник.

...