целочислено постоянно препълване с GLSL (OpenGL ES2)

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

varying highp vec2 texcoord;
uniform ivec4 texdata[172800];
void main(){
 int pixel = int(360.0 * texcoord.y + texcoord.x);
 gl_FragColor = vec4(texdata[pixel].x,texdata[pixel].y,texdata[pixel].z,1);
}

Как мога да предам тези данни?


person Matthew Mitchell    schedule 26.01.2011    source източник


Отговори (3)


Всъщност по-новите модели на iOS, които поддържат OpenGL ES 2.0, имат способността да използват текстури без степен на две, защото това е предвидено в спецификацията на OpenGL ES 2.0. Тези устройства позволяват също да се използват текстури, различни от степента на две, в OpenGL ES 1.1 чрез GL_APPLE_texture_2D_limited_npot разширение, което описвам по-подробно в моя отговор тук.

Ограниченията, които Apple налага върху тези текстури, които не са мощност от две, е, че те не трябва да бъдат mipmapped и трябва да използват GL_CLAMP_TO_EDGE за обвиване:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Използвам такива текстури в моето примерно приложение OpenGL ES 2.0 тук.

Не трябва да се налага да намирате друг начин да предавате вашите текстури към вашите шейдъри на тези устройства.

person Brad Larson    schedule 26.01.2011
comment
Благодаря ти много. Значи трябва да задам параметрите на затягане и трябва да работи? В момента приложението ми изисква iOS 4 или по-нова версия и камера. За какви устройства работи това разширение? - person Matthew Mitchell; 27.01.2011
comment
Трябва да накарам нещо друго да работи, преди да мога да тествам дали текстурната подложка работи. Може просто да използвам метода на подплата, ако това означава, че мога да поддържам повече устройства. - person Matthew Mitchell; 27.01.2011
comment
Трябва да мога да го накарам лесно да избира между използването на npot и pot, но вероятно ще се притеснявам само ако техниката на подплънка е бавна или нещо подобно. Поне когато изпратя следващата версия на Apple. - person Matthew Mitchell; 27.01.2011
comment
@Matthew – Да, затягането беше последното нещо, от което се нуждаех, за да активирам текстури без степен на две в това примерно приложение. Отново можете да проверите моето примерно приложение, за да видите как работи това, защото то проследява базирано на цвят обект от входа на камерата (тествах го на iPhone 4, но вярвам, че работи и на 3G S). Доколкото разбирам, това разширение работи на целия хардуер на PowerVR SGX, така че всичко, което поддържа OpenGL ES 2.0. Не е гарантирано, че ще се поддържа от бъдещ хардуер, но не виждам причина те да спрат поддръжката. - person Brad Larson; 27.01.2011
comment
@Matthew - Всъщност, сега, след като го прочетох, спецификацията на OpenGL ES 2.0 осигурява сама по себе си текстури, които не са степен на две. Това разширение се прилага само за OpenGL ES 1.1, така че всички устройства, съвместими с OpenGL ES 2.0, трябва да поддържат текстури, които не са степен на две. Мисля, че затягането може да е ограничение, което Apple прилага в допълнение към това, което се казва в спецификацията. Освен това мисля, че Apple все още изисква mipmapped текстури да бъдат степен на две. - person Brad Larson; 27.01.2011
comment
Добре. Благодаря за това. Странно, не намерих нищо, когато го търся. Знаете ли колко много използването на шейдъри подобрява производителността на манипулиране на изображения и изобразяване от камерата. Това се стремя да направя. - person Matthew Mitchell; 27.01.2011
comment
Имам моя много подобен на вашия пример и просто няма да работи. :( - person Matthew Mitchell; 27.01.2011
comment
Получих работа! Намерих грешка. Височината трябваше да бъде Ширина. Много благодаря. Ако някой, който е отговорил тук, иска промоционален код за платената версия на това приложение, когато е готово, нека ме уведоми. - person Matthew Mitchell; 27.01.2011
comment
@Matthew – По отношение на производителността, вижте статията, която написах, за да върви заедно с примерното приложение: sunsetlakesoftware.com/2010/10/22/ . Използването на шейдъри за извършване на масивни паралелни операции на GPU може да доведе до 14X-28X ускорение в моите бенчмаркове. - person Brad Larson; 27.01.2011

Спецификацията на OpenGL/ES 2 изисква само целите числа на GLSL да са поне 17 бита (способни да представят диапазона [-2^16,2^16)), а целите числа се използват за индекси на масиви, така че не можете надеждно да създадете масив с повече от 65535 елемента. Във всеки случай може да не успеете да създадете толкова голям, тъй като има ограничения за общото количество унифицирани данни, които може да са много по-ниски. Ако искате достъп до по-голямо количество данни, трябва да използвате текстура.

Тази грешка вероятно идва от вашата целочислена константа 172800, която очевидно е твърде голяма за внедряването на GLSL на вашата платформа.

person Chris Dodd    schedule 26.01.2011
comment
Благодаря ти. Ще пробвам идеята за подплата. Глупаво е, че трябва да имате мощност от две текстури. Единствената причина, поради която открих, е mipmapping. Дори не използвам mipmapping. Благодарение на това трябва да губя памет. Apple трябва да поправи това (освен ако хората не пропускат нещо?). - person Matthew Mitchell; 26.01.2011

Има цели за текстури, които не са степен на 2, така че няма причина да правите това. http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt

Или просто поставяте вашите данни, които не са на степен 2, в рамка на степен 2.

person datenwolf    schedule 26.01.2011
comment
Това е OpenGL разширение и той изглежда използва OpenGL ES. - person Dr. Snoopy; 26.01.2011
comment
Тогава ще трябва да използвам подложка? Хм. Ще трябва да отделя памет, за да побера изображението в текстура със степен на две и да използвам memcpy на всеки ред. Вече копирам данни в отделно хранилище, така че ще променя леко тази част и ще върна обратната връзка. Благодаря на всички. - person Matthew Mitchell; 26.01.2011