Войти
ПрограммированиеФорумГрафика

OpenGL кажется сошел с ума (и рисует сиськи)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 Следующая »
#0
19:21, 12 сен. 2018

Сиськи были только для привлечения внимания.
А вот сошел он с ума по настоящему. Итак рисую квадрат, на нем должна быть текстура, но её нет, и квадрат черный:
quad | OpenGL кажется сошел с ума (и рисует сиськи)
Рисуется оно таким шейдером:

#version 330 
uniform sampler2D uAtlasMap; 
vec4 Input1; 
 in  vec2 TEXCOORD0; 
layout(location = 0) out  vec4 SV_Target0; 
#define Output0 SV_Target0 
vec4 Temp[1]; 
ivec4 Temp_int[1]; 
uvec4 Temp_uint[1]; 
void main() 
{ 
    Input1.xy = TEXCOORD0.xy; 
    Temp[0] = textureLod(uAtlasMap, Input1.xy, intBitsToFloat(0x0)); 
    Output0.xy = Temp[0].xy; 
    Output0.zw = vec2(intBitsToFloat(0x0), intBitsToFloat(0x3F800000)); 
    return; 
}
Первые мои выводы были такими. Либо uAtlasMap неправильный, либо TEXCOORD0 кривой.

Сначала я проверил TEXCOORD0 заменив на вот такой шейдер:

#version 330 
vec4 Input1; 
 in  vec2 TEXCOORD0; 
layout(location = 0) out  vec4 SV_Target0; 
#define Output0 SV_Target0 
void main() 
{ 
    Input1.xy = TEXCOORD0.xy; 
    Output0.xy = Input1.xy; 
    Output0.zw = vec2(intBitsToFloat(0x0), intBitsToFloat(0x3F800000)); 
    return; 
}
И получил ожидамый градиент:
quad_grad | OpenGL кажется сошел с ума (и рисует сиськи)

Потом полез смотреть в CodeXL, что же там с текстурой, и установкой текстуры:
codexl_scr | OpenGL кажется сошел с ума (и рисует сиськи)
По CodeXL это RG текстура, не пустая, устанавливается на нулевой слот, после чего через glUniform1i передается 0 на четвертую юниформу. Юниформа в шейдере четрветая:
uniform | OpenGL кажется сошел с ума (и рисует сиськи)
То есть вроде все правильно.
Но текстура не рисуется.
Почему? Что могло еще повлиять на отрисовку текстуры?

#1
19:35, 12 сен. 2018

Зачем так обманывать ?!
Я их не вижу !

#2
19:38, 12 сен. 2018

Ziltop
> Я их не вижу !
Изображение

#3
19:39, 12 сен. 2018

Ну пусть Шурик тогда свои покажет :)

#4
(Правка: 19:43) 19:43, 12 сен. 2018

Мб не стоило писать intBitsToFloat(0x0)? Напиши просто 0.0f. intBitsToFloat, по-моему, делает побитовое копирование, а не преобразование типов.

#5
(Правка: 19:48) 19:46, 12 сен. 2018

Ну еще например текстура не pot и неподдерживаемая фильтрация (это если ты под мобилы пишешь). Либо же мипы до конца не залиты. А эта полоска это так и задумано было?

#6
19:50, 12 сен. 2018

BingoBongo
> Мб не стоило писать intBitsToFloat(0x0)? Напиши просто 0.0f. intBitsToFloat,
> по-моему, делает побитовое копирование, а не преобразование типов.
Это не я писал, а транслятор. Впринципе я могу это поменять руками. Но я уверен, что это не поможет (но сейчас проверю конечно).

Андрей5000
> Ну еще например текстура не pot и неподдерживаемая фильтрация.
Текстура 256*256. Это на скрине выше видно. Мипов нет, но я ведь выбираю нулевой мип: Temp[0] = textureLod(uAtlasMap, Input1.xy, intBitsToFloat(0x0));

#7
19:56, 12 сен. 2018

Андрей5000
> А эта полоска это так и задумано было?
Ах, да. Полоска - так и задумано, это уже другая геометрия поверх рисуется.

#8
19:58, 12 сен. 2018

BingoBongo
Заменил шейдер на:

#version 330 
uniform sampler2D uAtlasMap; 
vec4 Input1; 
 in  vec2 TEXCOORD0; 
layout(location = 0) out  vec4 SV_Target0; 
#define Output0 SV_Target0 
vec4 Temp[1]; 
ivec4 Temp_int[1]; 
uvec4 Temp_uint[1]; 
void main() 
{ 
    Input1.xy = TEXCOORD0.xy; 
    Temp[0] = textureLod(uAtlasMap, Input1.xy, 0.0); 
    Output0.xy = Temp[0].xy; 
    Output0.zw = vec2(0.0, 1.0); 
    return; 
} 
Ничего не изменилось. Все так же рисуется:
+ Показать
#9
20:21, 12 сен. 2018

MrShoor
> Ничего не изменилось. Все так же рисуется:
Точнее сиськи всё так же не рисуются :) так может проще готовую текстуру с голой бабой воткнуть и не париться? )))

#10
20:28, 12 сен. 2018

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

#11
(Правка: 20:43) 20:43, 12 сен. 2018

kas
> вроде когда трилинейка и не полный мипчейн надо указывать максимальный мип явно для текстуры
А вот это уже сработало, спасибо! Ни ворнинга тебе, ничего, тишина, несколько часов убил на эту проблему.

#12
20:44, 12 сен. 2018

MrShoor
> Ничего не изменилось. Все так же рисуется:
Значит проблема не в шейдере, а в вызовах OpenGL API.

#13
20:47, 12 сен. 2018

MrShoor
> А вот это уже сработало, спасибо! Ни ворнинга тебе, ничего, тишина.
а откуда огл знает что вон те черные мип уровни содержат не то что тебе надо?

#14
(Правка: 20:53) 20:53, 12 сен. 2018

/A\
> а откуда огл знает что вон те черные мип уровни содержат не то что тебе надо?
1. Текстура не содежит мипов. OpenGL это знает, потому что я создавал всего один нулевой мип (это видно на скриншоте выше).
2. Я явно в шейдере говорю "дай мне нулевой мип": Temp[0] = textureLod(uAtlasMap, Input1.xy, 0.0);

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика