LINUX.ORG.RU

обратная сторона плоскости

 ,


0

1

Здравствуйте дорогие форумчане! Подскажите как раскрасить обратную сторону четырехугольника в Opengl с Си. Cейчас я подгружаю текстуры так:

int LoadGLTextures( )
{
	int Status = FALSE;
	SDL_Surface *TextureImage[100];
	int texture_id;
	char *texture_path;
	for ( texture_id = 0; texture_id < 33; ++texture_id) {
	texture_path="jpg/";
	texture_path=char_append(texture_path, karti[texture_id]);
	texture_path=char_append(texture_path,".jpg");
	
	if ( ( TextureImage[texture_id] = IMG_Load( texture_path ) ) )
		{
		Status = TRUE;
		glGenTextures( 1, &texture[texture_id] );
		glBindTexture( GL_TEXTURE_2D, texture[texture_id] );
		glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[texture_id]->w, TextureImage[texture_id]->h, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[texture_id]->pixels );
		glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
		glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
		}
	if ( TextureImage[texture_id] ) { SDL_FreeSurface( TextureImage[texture_id] ); }
	}
	return Status;
}

а рисуются они на обеих сторонах четырехугольника, так:

void drawGLPlane(float card_x, float card_y, float card_z, float center_x, float center_y, float center_z, float card_width, float card_height, float angle_value_x, float angle_value_y, float angle_value_z, float  card_alpha, float texture)
{
	glPushMatrix();
	glTranslatef( card_x, card_y, card_z  );
	glRotatef( angle_value_x, 1.0, 0.0, 0.0);
	glRotatef( angle_value_y, 0.0, 1.0, 0.0);
	glRotatef( angle_value_z, 0.0, 0.0, 1.0);
	glTranslatef( center_x, center_y, center_z  ); 	
	glBindTexture( GL_TEXTURE_2D, texture );
	glColor4f(1.0f,1.0f,1.0f, card_alpha);	
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_BLEND);
	glBegin(GL_QUADS);
		glTexCoord2f( 0.0, 1.0 ); glVertex3f( -card_width-center_x, -card_height-center_y, 0.0 );
		glTexCoord2f( 1.0, 1.0 ); glVertex3f(  card_width-center_x, -card_height-center_y, 0.0 );
		glTexCoord2f( 1.0, 0.0 ); glVertex3f(  card_width-center_x,  card_height-center_y, 0.0 );
		glTexCoord2f( 0.0, 0.0 ); glVertex3f( -card_width-center_x,  card_height-center_y, 0.0 );
	glEnd( );
	glDisable(GL_BLEND);
	glPopMatrix();	
}

Каким образом наложить 2 текстуры по разным сторонам? Надеюсь, что уже кто то подобное делал. Спасибо заранее!

★★★

Ответ на: комментарий от Harald

я об этом думал, но либо зазор, либо артефакты будут и лишние сучности

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

glDisable (GL_CULL_FACE)

на 100% не уверен, с графикой уже очень давно не работал.

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

Никак, либо два квада, либо шейдер. И да, glEnable(GL_CULL_FACE), если будешь два квада рисовать, что б не моргало

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

Спасибо за ответы всем, я пробую один вариант с 2-я четырехугольниками и ещё «осенило» менять текстуру как только к камере становится ребром при вращении прямоугольника. Посмотрим... сдалаю и так и так, как лучше отпишусь тут.

Frost ★★★ ()

gavlig Harald waker pozitiffcat ck114

оказалось что лучше менять текстуру при повороте, это быстрее и условия определения углов плоскости по отношению к камере всего 3, то есть как только плоскость становится ребром к камере меняем текстуру

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

гы. я оказывается исходное сообщение неправильно прочитал. конечно, если текстура разная с двух сторон — нужно просто 2 полигона с разными текстурами рисовать.

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

Ну вот с этими вашими «неохота отслеживать», «памяти ж много , она копеечная» получается современное ПО, которое только и умеет что жрать, жрать, жрать, жрать, жрать и еще раз жрать ресурсы.

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

Нарисовать два полигона вместо одного выгоднее, чем проверять условие и рисовать один полигон.

kvap ()
Ответ на: комментарий от Eddy_Em

это карты игральные, преферанс, 32 прямоугольника или 64 лучше крутить? короче нужно доказательство выполнения сделать... ладно, сделаю

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

Тьфу ты! Ты анимируешь переворачивание карт? Так бы сразу и сказал... Я-то думал, что у тебя какая-то толпа плоских объектов в 3D болтается, а вокруг них "камера ездит".

В твоем-то случае, ясен перь, вариант смены текстуры предпочтительней.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Это слишком дёшево. Нужно больше eye-candy, дешёвые говноигры уже лет 20 мало кому интересны. Нужны тесселяция, освещение, красивые тени с ambient occlusion, всё это.

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

Как сказать. За Opengl 1.x многие я думаю спасибо скажут, в особенности если потребление ниже плинтуса. Я для себя и семьи пишу в свободное время, если не интересно будет другим то и выкладывать не буду, аналоги где то за бабки видел, тоже самое если не сказать хуже и под андроид тоже за бабки.

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

Обладатели столь примитивных устройств — довольно скромная аудитория, как в плане численности, так и в отношении аппетитов. Opengl 1.x очень deprecated, однако, если кому-то хочется потратить впустую некоторое время — это его право.

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

там возможно создание теней, отражений, постановка света, правда некоторая эмуляция... а рыбки во всем известном скринсейвере аквариума Dream Aquarium под винду, что плохо сделан? там и Directx и OpenGL 1.x. реализованы

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

Нееет! Достаточно одного полигона! И менять текстуру когда прямоугольник переворачивается на другую сторону.

фактически это и есть 2 разных полигона.

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