LINUX.ORG.RU

Загрузка текстуры opengl objective C


0

0

Помогите пожалуйста найти ошибку. Вот код: GLuint amp;
CGImageRef textureImage = [UIImage imageNamed:@«arrow_left.png»].CGImage;
if (textureImage == nil) {
NSLog(@«Failed to load texture image»);
return;
}
NSInteger texWidth = CGImageGetWidth(textureImage);
NSInteger texHeight = CGImageGetHeight(textureImage);
GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4);
CGContextRef textureContext = CGBitmapContextCreate( textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast); GLuint textures[10];
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);
CGContextRelease(textureContext);
glGenTextures(1, &amp);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);
free(textureData);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
const GLfloat squareVertices[] = {
-1.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0,
1.0, 1.0, 0.0 };
const GLshort squareTextureCoords[] = {
0, 1,
0, 0,
1, 0,
1, 1
};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-3.0, 3.0,-4.5 , 4.5, -4.0,4.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4f(0.0, 1.0, 1.0, 1.0);
//glTranslatef(1.5, 0.0, -6.0);
//glRotatef(30, 0.0, 0.0, 1.0);
glVertexPointer(3, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_SHORT, 0, squareTextureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_SHORT, 0, squareTextureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

Всем заранее спасибо!


1. форматирование
2. что не так собственно?
3. обрати внимание что ты здесь делаешь, и что у тебя в textures[0]:

glGenTextures(1, &amp);
glBindTexture(GL_TEXTURE_2D, textures[0]);

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

Да я потом это тоже увидел и поэтому исправил:

glGenTextures(1, &amp);
glBindTexture(GL_TEXTURE_2D, textures[0]);

на:

glGenTextures(1, &amp);
glBindTexture(GL_TEXTURE_2D, amp);
Но текстуры все равно не оказалось на рисунке. Этот пример я просто выдернул из инета, чтобы хоть чтото заработало.

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

Про бинд текстуры уже сказали, что в textureData? Что говорит glGetError():

GLenum error = glGetError();
if(GL_NO_ERROR != error) {
   // тут смотрим, что за ошибка
}
andreyu ★★★★★
()
Ответ на: комментарий от ECLIPSE

А полигоны есть? Меня смущает то, что ты сначала используешь GL_TEXTURE_2D, а потом делаешь его enable, хотя по логике должно быть наоборот.

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

Я щас испотльзую новый вроде как рабочий пример из игры.

glClear(GL_COLOR_BUFFER_BIT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	GLfloat processIconVertexes[12];
	GLfloat processIconTexCoords[8];
	glOrthof(-240.0f, 240.0f, -160.0f, 160.0f, -1000.0f, 1000.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	processIconVertexes[0] = 20.0f; processIconVertexes[1] = 20.0f; processIconVertexes[2] = 0.001f;
	processIconVertexes[3] = 61.0f; processIconVertexes[4] = 20.0f; processIconVertexes[5] = 0.001f;
	processIconVertexes[6] = 20.0f; processIconVertexes[7] = 61.0f; processIconVertexes[8] = 0.001f;
	processIconVertexes[9] = 61.0f; processIconVertexes[10] = 61.0f; processIconVertexes[11] = 0.001f;
	
	processIconTexCoords[0] = 0.0f; processIconTexCoords[1] = 1.0f;
	processIconTexCoords[2] = 1.0f; processIconTexCoords[3] = 1.0f;
	processIconTexCoords[4] = 0.0f; processIconTexCoords[5] = 0.0f;
	processIconTexCoords[6] = 1.0f; processIconTexCoords[7] = 0.0f;


	if(currentTexture != 0)
	{
		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, currentTexture);
		glTexCoordPointer(2, GL_FLOAT, 0, processIconTexCoords);
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	}
	
	glVertexPointer(3, GL_FLOAT, 0, processIconVertexes);
	glEnableClientState(GL_VERTEX_ARRAY);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);

	GLenum error = glGetError(); 
	if(GL_NO_ERROR != error) { 
		NSLog(@"freezer"); 
	}

А сама текстура есть и норм загрузилась. Ее айдишник равен 1. Ошибок никаких нет.

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

это у тебя видюха кривая, у меня

GL_ARB_texture_non_power_of_two:                               OK

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

А вообще это решается просто — выделаешь под текстуру видеопамять по степени двойки, а отрисовываешь только её нужный кусок.

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