LINUX.ORG.RU

Текстуры в OpenGL 4

 


2

2

Проблема с наложением текстуры в OpenGL 4. Рисуется простой прямоугольник. Хочу наложить на него простейшую 2x2 текстуру (первый тексель-красный цвет, второй - зеленый, третий - синий, четевертый - желтый). То есть по логике в мой прямоугольник должны вписаться 4 разноцветных прямоугольника (красный, зеленый, синий, желтый). В итоге на выходе получаю прямоугольник, залитый одним цветом (темно-желтым). Причем этот итоговый цвет судя по всему является смешением цветов текселей (пробовал менять тексели 2x2 текстуры). То есть вместо того, чтобы накладывать на пиксели прямоугольника пиксели текстуры(тексели), OpenGL смешивает все тексели текстуры, получает 1 итоговый цвет и полностью им заливает прямоугольник. Как так? P.S. API еще только изучаю по OpenGL Red book 8th edition.

Вот фрагмент исходников:


			static GLuint TexCoordAttribLoc=glGetAttribLocation(SHAP,"inTextura_coord");
			static GLuint TextureId;
			static GLuint SamplerId;

			static const GLfloat TexCoord[]=
			{
				0.0f,0.0f,	1.0f,0.0f,
				1.0f,1.0f,	0.0f,1.0f
			};

			static const GLfloat Texels[16]=
			{
				1.0f,0.0f,0.0f,1.0f,	0.0f,1.0f,0.0f,1.0f,
				0.0f,0.0f,1.0f,1.0f,	1.0f,1.0f,0.0f,1.0f
			};

                        glActiveTexture(GL_TEXTURE0);

			glGenTextures(1,&TextureId);
			glGenSamplers(1,&SamplerId);
			glBindSampler(0, SamplerId);

                        glBindTexture(GL_TEXTURE_2D, TextureId);

			glTexStorage2D(GL_TEXTURE_2D,1,GL_RGBA32F, 2,2);

			glTexSubImage2D(GL_TEXTURE_2D,0,0,0,2,2,GL_RGBA,GL_FLOAT,Texels);

			glVertexAttribPointer(TexCoordAttribLoc,2,GL_FLOAT,GL_FALSE,0,TexCoord);
			glEnableVertexAttribArray(TexCoordAttribLoc);

Код вершинного шейдера

#version 430 core 
layout (location = 0) in vec4 vPosition;
layout(location=1) uniform mat4 CurrentMdMatrix=mat4(1.0f); 
layout(location=5) uniform mat4 CurrentPrMatrix=mat4(1.0f);
layout(location=9) in vec4 vColor;

layout(location=15) in vec2 inTextura_coord;
out vec2 textura_coord;

out vec4 FragmentColor;
void main()
{
  textura_coord=inTextura_coord;
  FragmentColor=vColor;
  gl_Position=CurrentPrMatrix*CurrentMdMatrix*vPosition;
} 

на переменные vColor и FragmentColor не обращайте внимание,я просто их не стал удалять с предыдущей версии шейдера.

Фрагментный (пиксельный) шейдер:

#version 430 core
uniform sampler2D textura;
in vec2 textura_coord;
in vec4 FragmentColor;
out vec4 fColor;
void main()
{
  gl_FragColor=texture(textura,textura_coord);
} 

Попробуй для начала увеличить размер текстуры.

O02eg ★★★★★
()
Последнее исправление: O02eg (всего исправлений: 1)

Такие малые текстуры могут быть запросто запрещены. Они должны быть в допустимых границах и размеры - степени двойки, по крайней мере так было во времена динозавров, когда я занимался графикой.

vertexua ★★★★★
()

По поводу размера текстуры: так интересно, что в самой OpenGL Red Book 8-го издание в примерах подобная 2x2 текстура, да и glGetError выдает GL_NO_ERROR.

Ты с дубу рухнул что ли? Для элементарных текстур шейдеры писать? Есть же glQuads всякие...

Для элементарных текстур были написаны вполне элементарные шейдеры. Эдик,твое мнение касательно шейдеров знает почти весь форум.Его не разделяет ни консорциум OpenGL, ни (что самое смешное) производители видеокарт, так как стандарт OpenGL главным образом развивается на устоявшихся и полезных расширениях OpenGL от производителей GPU. Я изучаю механизм работы текстур,а не ищу 1-2 функции из стандарта. Если ты намерен устроить очередной холивар - иди в баню.С девчонками, пусть они послушают, какой ты No-Shaders самец.

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

По поводу размера текстуры: так интересно, что в самой OpenGL Red Book 8-го издание в примерах подобная 2x2 текстура, да и glGetError выдает GL_NO_ERROR.

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

O02eg ★★★★★
()
Ответ на: комментарий от karmich

Если ты имеешь в виду GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER

и параметры GL_LINEAR или GL_NEAREST, то я крутил и так и сяк,меняется итоговый цвет, но он по-прежнему сплошной на весь прямоугольник.

Кстати, загрузил из файла 1024x1024 текстуру - проблема так и не исчезла, так что дело скорее всего не в размере.

Nerevarino
() автор топика

Попробую портировать эту мелочь на Windows.....и если окажется, что проблема в драйвере на Linux от ATI - буду долго не убирать руку с лица...

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

glGetError выдает GL_NO_ERROR

Use KHR_debug, Luke.

По поводу кода. Меня смущает вот эта строка:

glVertexAttribPointer(TexCoordAttribLoc,2,GL_FLOAT,GL_FALSE,0,TexCoord);
Учитывая, что используется контекст ядра, то данные массива TexCoord должны находиться в буфере (glGenBuffers), а последним параметром функции glVertexAttribPointer является смещение в байтах относительно начала вершины.

oh-la-la
()
Ответ на: комментарий от oh-la-la

Хмм, не думал об этом.Сами вершины прямоугольника, к слову, я пробовал передавать и через GenBuffers и также как тут.И так и так работало, может конечно с текстурами иначе.Кстати, в самом учебнике координаты текстур не только в буфере, но и в том же буфере, что и сами вершины.Ладно, спасибо за наводку, попробую. Все - таки еще раз убеждаюсь, что сперва нужно полностью списать с учебника, а уже потом крутить.

Nerevarino
() автор топика
Ответ на: комментарий от oh-la-la

Попробовал засунуть координаты текстур в буфер к вершинам.Та же фигня.Все тот же единый цвет.Видимо, там и так и так можно, без разницы.

Nerevarino
() автор топика
Ответ на: комментарий от Stil

Попробую тебе через как-то время кинуть исходники.У тебя linux и видеокарта от Nvidia?

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

А, забыл еще в Readme указать, что нужно использовать новый стандарт c++ 11 года.

Nerevarino
() автор топика
Ответ на: комментарий от oh-la-la

Спасибо за прогу, но она отобразила у меня целиком белый квадрат, а что у тебя отображает?Как положено текстуру?

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

Да, текстуру, но скорее это мой косяк и я что-то не доглядел. Сейчас нет под рукой АМД карты, проверил бы на ней.
Добавь перед вызовом glDrawElements: glUniform1i(0, 0); должно заработать.

oh-la-la
()
Последнее исправление: oh-la-la (всего исправлений: 1)
Ответ на: комментарий от oh-la-la

Но в целом, я так понимаю, вполне возможно, то проблема в дровах? Я бы поверил в это, но почему тогда какой-нибудь нативный Half-Life 2 из стима запускается и демонстрирует в игре нормальные текстуры?Значит все-таки не драйвер? У меня ща мозг вспухнет)

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

а у меня чёрный квадрат на месе %)

Я бы поверил в это, но почему тогда какой-нибудь нативный Half-Life 2 из стима запускается и демонстрирует в игре нормальные текстуры?Значит все-таки не драйвер?

Они просто не 4ку используют, а 2.1, может 3.*

// твой код мне отдал GL_INVALID_OPERATION в ините сцены и ничего не нарисовал

Stil ★★★★★
()
Последнее исправление: Stil (всего исправлений: 1)
Ответ на: комментарий от Nerevarino

Ну я очень сомневаюсь, что проблема в драйвере. Лично я не сталкивался с некорректным поведением OpenGL на АМД картах. Были какие-то проблемы с производительностью, но в целом они работают. Но я и не писал никогда ГРАФОН.

oh-la-la
()
Ответ на: комментарий от Nerevarino

Хотя есть еще такой момент, комп у меня 2011 года и видеокарта соответственно, не помню какой на то время стандарт OpenGL был в ходу, но может в этом дело? Хоть формально glxinfo и говорит, что у меня opengl 4.3 при текущем драйвере, но наверняка новые функции реализованы программно, а не аппаратно, видюха старовата же. Вот в этой программной реализации может и косяк?

Nerevarino
() автор топика
Ответ на: комментарий от oh-la-la

не, чувак, у меня меса, оно OpenGL выше 3.3 официально не поддерживает (http://cgit.freedesktop.org/mesa/mesa/tree/docs/GL3.txt), так что в моем случае чёрный квадрат это не «возможно баг в драйвере», а «скорее всего баг в драйвере»

Stil ★★★★★
()
Ответ на: комментарий от oh-la-la

Ну значит вероятнось, что это мой косяк повышается =)
Надо подключать KHR_debug и смотреть лог.

Слушай, ну у тебя же при том же коде ведь отображается текстура

Эмм, я про KHR_debug первый раз слышу,нуб же.Ща погуглю.

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

Слушай, ну у тебя же при том же коде ведь отображается текстура

Сейчас стоит нвидиа, в коде вероятно есть UB, которое вендоры трактуют по разному или не соответсвие спеке. Проверь вот это http://pastebin.com/XVBYYzsi ошибки должны в stderr падать.

не, чувак, у меня меса, оно OpenGL выше 3.3 официально не поддерживает

Здесь на самом деле OpenGL 3.3 и есть. GL_ARB_shading_language_420pack в месе поддерживается.

oh-la-la
()
Ответ на: комментарий от oh-la-la

Слушайте, спасибо вам парни, что так содействуете в решении проблемы)

Nerevarino
() автор топика
Ответ на: комментарий от oh-la-la

Твой последний код выдает такое (на случай, если разберешься с этим быстрее)

Example.cpp: In function ‘int main(int, char**)’:
Example.cpp:163:48: error: invalid conversion from ‘void (*)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, void*) 
{aka void (*)(unsigned int, unsigned int, unsigned int, unsigned int, int, const char*, void*)}’ 
to ‘GLDEBUGPROC {aka void (*)(unsigned int, unsigned int, unsigned int, unsigned int, int, const char*, const void*)}’ [-fpermissive]
     glDebugMessageCallback(onDebugMessage, NULL);

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

Замени «void *» на «const void *» в последнем аргументе функции onDebugMessage.

oh-la-la
()
Последнее исправление: oh-la-la (всего исправлений: 1)
Ответ на: комментарий от oh-la-la

у тебя не хватает glCompileShader, по крайней мере у меня до этой команды ошибки были

!>> GL_INVALID_OPERATION in glUseProgram(program 1 not linked)
!>> GL_INVALID_OPERATION in glUniform(program not linked)

после нее - !>> 0:2(9): error: unrecognized layout identifier `binding'

на что его изменить яхз, в опенгл нивзубногой %)

Stil ★★★★★
()
Ответ на: комментарий от Stil

у тебя не хватает glCompileShader, по крайней мере у меня до этой команды ошибки были

Ох, и правда не хватает =) Скорее всего белый/черный квадрат был из-за этого. Нвидивский драйвер даже не ругнулся на это, лол.

на что его изменить яхз, в опенгл нивзубногой %)

Ну, мб в месе не до конца сделано.

чем бы это ни было :)

Ну это и должно нарисоваться.

Nerevarino
Вот пофикшеная http://pastebin.com/vXUfnPTT

oh-la-la
()
Ответ на: комментарий от Stil

Вот собственноручно написанная программа для проверки компиляции шейдеров . Используйте из командной строки, файлы с шейдерами должны быть в той же папке, что и эта прога GLSL_Source_Checker. А также форматы шейдеров только такие : vert, tesc,tese,geom,frag,comp.Прога использует SDL2 и GLEW.

Пример вызова проги:

./GLSL_Source_Checker ClassicVertexCoordPipeline.vert SimpleTexture.frag

Прога: https://yadi.sk/d/d2mKkuulfyztF

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino

Чтож, попробую реализовать такую же простейшую текстуру используя старый OpenGL с glBegin, glEnd и glTexCoord

Смысла нет. Потому что вообще на 4.3 текстуры работают. Косяк где-то в коде.

O02eg ★★★★★
()
Ответ на: комментарий от Nerevarino

Ну, как я и говорил, ошибка не в дровах, а в руках.

Так как в первоначальном коде я забил на проверки там был тупо пропущен вызов glCompileShader. Из-за этого белый квадрат и рисовался (хотя могло вобщем-то ничего не нарисоваться).

oh-la-la
()
Ответ на: комментарий от Nerevarino

Шейдеры по большому счету ничего не знают про текущее состояние конвеера. И им надо сообщить откуда брать и куда класть данные (любые вобще). В данном случае мы говорим, что для выборки из семплера DiffuseTexture надо использовать текстурный слот 0.

Можешь поглядеть вот эти туторы: https://code.google.com/p/gl33lessons/ они под винду, но общее представление дадут.

oh-la-la
()
Ответ на: комментарий от Nerevarino

первое что я тебе посоветую — срисовать у него функцию (и установку хандлеров) для отладки и добавить в свой код SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);. Эта комбинация сразу вывалила мне в консоль кучу ошибок...

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.