Текстура в OpenGL неправильная - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь нарисовать прямоугольник в OpenGL с текстурой. прежде чем писать текстуру в прямоугольник, я рисую один примитив OpenGL с соответствующим цветом. Затем я записываю текстуру в прямоугольник, используя приведенный ниже код, где переменный буфер содержит данные RGB для 800x600 пикселей. Но выполнение выполнения фрагмента кода приводит к тому, что цвет внутри прямоугольника остается заполненным цветом из примитива. Что я делаю не так?

Обновление кода с 07.11.19

фрагмент кода:

    //glDisable(GL_COLOR_MATERIAL);

    glScalef(1,1,1);
    glPixelstorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures (1, @texID);
    glBindTexture (GL_TEXTURE_2D,texID);

    if schglobal=1 then
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_BGR, GL_UNSIGNED_BYTE, buffer)
                   else
                   begin
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_BGR, GL_UNSIGNED_BYTE, buffer)
                   end;

    glcolor3i(255,255,255);
    //glcolor3i(0,0,0);
    //glcolor3i(0,0,0);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    //glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
    glBindTexture (GL_TEXTURE_2D,texID);
    glEnable(GL_TEXTURE_2D);
    glBegin (GL_QUADS);
    glTexCoord2f (0, 0);
    glVertex3f (vertexes[4,1], vertexes[4,2], vertexes[4,3]);
    glTexCoord2f (1, 0);
    glVertex3f (vertexes[2,1], vertexes[2,2], vertexes[2,3]);
    glTexCoord2f (1, 1);
    glVertex3f (vertexes[1,1], vertexes[1,2], vertexes[1,3]);
    glTexCoord2f (0, 1);
    glVertex3f (vertexes[3,1], vertexes[3,2], vertexes[3,3]);
    glEnd;
    ans:=glGetError;
    //glFlush();
    //glBindTexture (GL_TEXTURE_2D,0);
    glDisable(GL_TEXTURE_2D);

Обновление кода с08.11.19 (работает, но не работает, если glTexSubImage2D использовал ошибку 1281)

    glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glScalef(1,1,1);
    glPixelstorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures (1, @texID);
    glBindTexture (GL_TEXTURE_2D,texID);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    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_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    if use_gltexsubimage=false then
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_BGR, GL_UNSIGNED_BYTE, buffer)
                               else begin
    if use_glteximage=true then begin
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_BGR, GL_UNSIGNED_BYTE, buffer);
    use_glteximage:=false;
    end
                           else begin
    glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 800, 600, GL_RGB, GL_UNSIGNED_BYTE, buffer);
            ans:=glGetError;
                        end;
                                    end;

    glcolor3f(1,1,1);

    glBindTexture (GL_TEXTURE_2D,texID);
    glEnable(GL_TEXTURE_2D);
    glBegin (GL_QUADS);
    glTexCoord2f (0, 0);
    glVertex3f (vertexes[4,1], vertexes[4,2], vertexes[4,3]);
    glTexCoord2f (1, 0);
    glVertex3f (vertexes[2,1], vertexes[2,2], vertexes[2,3]);
    glTexCoord2f (1, 1);
    glVertex3f (vertexes[1,1], vertexes[1,2], vertexes[1,3]);
    glTexCoord2f (0, 1);
    glVertex3f (vertexes[3,1], vertexes[3,2], vertexes[3,3]);
    glEnd;
    glBindTexture (GL_TEXTURE_2D,0);

                     end;

1 Ответ

0 голосов
/ 12 ноября 2019

Я решаю свою проблему с помощью glTexSubImage2d. Я перенес генерацию текстуры в процедуру создания формы и удаление текстуры в процедуру закрытия формы.

...