oGL - rysowanie kwadratów i wypełnianie "teksturą"

0

Cześć.

Mam jak na razie taki kod:

#include <GL/glut.h>

void Display()
{
    glClearColor(0,0,0,0);

    glClear( GL_COLOR_BUFFER_BIT );

    glColor3f( 1.0, 0.0, 0.0 );
    glBegin(GL_QUADS);
    glVertex2f(0,0);
    glVertex2f(0.2,0);
    glVertex2f(0.2,0.2);
    glVertex2f(0,0.2);
    glEnd();

    glFlush();

    glutSwapBuffers();
}
void Reshape( int width, int height )
{
    Display();
}
int main( int argc, char * argv[] )
{
    glutInit( & argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
    glutInitWindowSize( 800, 450 );
    glutCreateWindow("H3h3");

    glutDisplayFunc( Display );
    glutReshapeFunc( Reshape );

    glutMainLoop();
    return 0;
}

Okej i moje pytania:

  1. Czy da się jakoś zmienić to:
    glVertex2f(0,0);
    glVertex2f(0.2,0);
    glVertex2f(0.2,0.2);
    glVertex2f(0,0.2);

żeby móc tu wpisać x i y czyli np. glVertex2f(241,214);

  1. Jeśli chcę zrobić więcej kwadratów to czy w pętli wykonuję:
    glBegin(GL_QUADS);
    glVertex2f(0,0);
    glVertex2f(0.2,0);
    glVertex2f(0.2,0.2);
    glVertex2f(0,0.2);
    glEnd();

czy może jakoś inaczej to ma wyglądać w oGL?

  1. Jak ustawić jako "tło" (?kolor) takiego kwadratu z pliku .png (np. zrobię plik 32x32 .png i z jego chcę ustawić jako "teksturę" tego kwadratu)

Z góry dzięki za odpowiedzi!

1

eby móc tu wpisać x i y czyli np. glVertex2f(241,214);
nie rozumiem pytania; kto ci broni zrobić glVertex2f(x,y) albo glVertex2f(241,214)?

Jeśli chcę zrobić więcej kwadratów to czy w pętli wykonuję:
Możesz w pętli, to będzie najprostsze na początek. Lepszym rozwiązaniem będzie glDrawArrays.

0

Dzięki!
A 3 pytanie? Jeśli można to proszę o pomoc z ładowaniem pliku .bmp (pobranie pixeli i utworzenie bitmapy).
Kombinuję coś takiego:

    HBITMAP hBitmap = (HBITMAP) LoadImage(0, "/data/img1.bmp" ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HDC dcBitmap = CreateCompatibleDC ( NULL );
    SelectObject( dcBitmap, hBitmap );

    BITMAPINFO bmpInfo;
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = 32;
    bmpInfo.bmiHeader.biHeight = -32;
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biBitCount = 32;
    bmpInfo.bmiHeader.biCompression = BI_RGB;
    bmpInfo.bmiHeader.biSizeImage = 0;

    COLORREF* pixel = new COLORREF [32*32];
    GetDIBits( dcBitmap , hBitmap , 0 , bm.bmHeight , pixel , &bmpInfo , DIB_RGB_COLORS );

P.S.
Chodzi o to, że tam podaję wartości od 0 do 1, a nie od 0 do x i jeszcze to zaczyna jakoś od środka..
http://msdn.microsoft.com/en-us/library/windows/desktop/dd374161(v=vs.85).aspx

0

Ja wymyśliłem ostatnio coś takiego.

// dodać Windowscodecs.lib do opcji linkera
#include <wincodec.h>

GLuint LoadTexture(std::wstring wFileName)
{
	CoInitialize(NULL);
 
	IWICImagingFactory *factory;
	HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory,
				NULL,
				CLSCTX_INPROC_SERVER,
				IID_IWICImagingFactory,
				(LPVOID*)&factory);
	if (FAILED(hr)) return 0;

	IWICBitmapDecoder *decoder;
	hr = factory->CreateDecoderFromFilename(wFileName.c_str(),
				NULL,
				GENERIC_READ,
				WICDecodeMetadataCacheOnDemand,
				&decoder);
	if (FAILED(hr)) return 0;

	IWICBitmapFrameDecode *frame;
	hr = decoder->GetFrame(0, &frame);
	if (FAILED(hr)) return 0;

	UINT w, h;
	frame->GetSize(&w, &h);
	
	WICPixelFormatGUID pf;
	hr = frame->GetPixelFormat(&pf);
	if (FAILED(hr) || pf != GUID_WICPixelFormat24bppBGR) return 0;

	size_t data_stride = 3 * w;
	size_t data_len = data_stride * h;
	unsigned char *data = (unsigned char*)malloc(data_len);

	unsigned char *scanline = data + data_len - data_stride;
	for (int i=0; i<h; i++)
	{
		WICRect wr = {0,i, w, 1};
		hr = frame->CopyPixels(&wr, data_stride, data_stride, scanline);
		scanline -= data_stride;
	}

	GLuint result;
	glGenTextures(1, &result);
	glBindTexture(GL_TEXTURE_2D, result);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
	
	free(data);
	frame->Release();
	decoder->Release();
	factory->Release();
	CoUninitialize();
	return result;
}

W tej wersji pozostawia sobie jeszcze wiele do życzenia (brakuje obsługi bitmap z przezroczystością, brak mipmappingu, factory niepotrzebnie tworzone za każdym razem na nowo), ale za to załaduje praktycznie każdy typ pliku - bmp, png, jpg...

0

Dzięki, a wiesz może gdzie mogę pobrać wincodec.h i .lib dla C::B bo nie mogę nigdzie znaleźć :(

0

Dobra jednak przeszłem na SDL'a dzięki opini paru osób.
Mam teraz taki kod:

#include <SDL/SDL.h>
SDL_Surface * ekran = NULL;
SDL_Surface * texture[100];

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 800, 450, 32, SDL_SWSURFACE );
    texture[0] = SDL_LoadBMP( "/data/background.bmp" );
    SDL_BlitSurface( texture[0], NULL, ekran, NULL );
    SDL_Flip( ekran );
    SDL_Delay( 2000 );
    SDL_Quit();
    for (int i = 0; i < 100; i++) SDL_FreeSurface( texture[i] );
    return 0;
}
  1. Dlaczego on mi nie pokazuje obrazka background.bmp w oknie, a powinien?
  2. Czy dobrze zrobiłem "czyszczenie" tekstur?

@Edit
Proszę o zamknięcie tego tematu, powstał nowy

1 użytkowników online, w tym zalogowanych: 0, gości: 1