|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
07.07.2011, 15:07
|
#1
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Рендер массива пикселей
Давно мечтал выводить в реалтайме массив пикселей на экран. Порыл по инету - не нашел ничего интересного (и русских источников)
Если кто сталкивался - подскажите, как сделать.
Язык абсолютно без разницы какой, гапи тоже. Главное результат.
PS желательно 800x600, если возможно, то больше)
|
(Offline)
|
|
07.07.2011, 15:24
|
#2
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Рендер массива пикселей
Давно мечтал выводить в реалтайме массив пикселей на экран. Порыл по инету - не нашел ничего интересного (и русских источников)
Если кто сталкивался - подскажите, как сделать.
Язык абсолютно без разницы какой, гапи тоже. Главное результат.
PS желательно 800x600, если возможно, то больше)
|
ну коль гапи без разницы: http://forum.boolean.name/showthread...ewpost&t=15076
|
(Offline)
|
|
07.07.2011, 16:26
|
#3
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Рендер массива пикселей
Думаю он спрашивает как сделать это наибилее быстро и незатратно, а не вложеным циклам for и функцие setPixel
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.07.2011, 17:34
|
#4
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Рендер массива пикселей
В том вся фишка. Реалтайм нужен
|
(Offline)
|
|
07.07.2011, 19:48
|
#5
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: Рендер массива пикселей
1) Можно отказатся от пикселей и рисовать сразу полигоны, думаю они намного быстрей рисуются.
2) Точно незнаю, но вроде в шейдере за один проход можно нарисовать over 9000 треугольников. Какнить до пикселей их уменьшить)
|
(Offline)
|
|
07.07.2011, 23:46
|
#6
|
Оператор ЭВМ
Регистрация: 20.11.2006
Сообщений: 38
Написано 8 полезных сообщений (для 11 пользователей)
|
Ответ: Рендер массива пикселей
Вот что минимально работает. Слеплено и скопировано из интернета, использует OpenGL, пиксель к пикселю, работает в CodeBlocks:
#include <windows.h>
#include <gl/gl.h>
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
void DisableOpenGL(HWND, HDC, HGLRC);
int p_CHIRINA=1024, p_VISOTA=768, p_CVET=4;
GLubyte *CVET_PIXSEL;
GLuint TEMP_Textyra;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
CVET_PIXSEL = (GLubyte*)malloc(p_CHIRINA * p_VISOTA * p_CVET * sizeof(GLubyte));
int x, y;
byte f;
WNDCLASSEX wcex;
HWND hwnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL bQuit = FALSE;
float theta = 0.0f;
/* register window class */
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_OWNDC;
wcex.lpfnWndProc = WindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "GLSample";
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);;
if (!RegisterClassEx(&wcex))
return 0;
/* create main window */
hwnd = CreateWindowEx(0,
"GLSample",
"OpenGL Sample",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
1024,
768,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, nCmdShow);
/* enable OpenGL for the window */
EnableOpenGL(hwnd, &hDC, &hRC);
/* program main loop */
while (!bQuit)
{
/* check for messages */
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
/* handle or dispatch messages */
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
f+=1;
for (x=0; x<p_CHIRINA;x++)
{
for (y=0; y<p_VISOTA;y++)
{
CVET_PIXSEL[x*p_CVET + y*p_CHIRINA*p_CVET + 0]=(GLubyte)255;
CVET_PIXSEL[x*p_CVET + y*p_CHIRINA*p_CVET + 1]=(GLubyte)rand()*255;
CVET_PIXSEL[x*p_CVET + y*p_CHIRINA*p_CVET + 2]=(GLubyte)f;
CVET_PIXSEL[x*p_CVET + y*p_CHIRINA*p_CVET + 3]=(GLubyte)255;
}
}
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &TEMP_Textyra);
glBindTexture(GL_TEXTURE_2D, TEMP_Textyra);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_CHIRINA, p_VISOTA, 0, GL_RGBA, GL_UNSIGNED_BYTE, CVET_PIXSEL);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); //glVertex3f(-1.0f, -1.0f, 1.0f); // Низ лево
glVertex2d(-1.0f,-1.0f); // Bottom Left
glTexCoord2f(1.0f, 0.0f); //glVertex3f( 1.0f, -1.0f, 1.0f); // Низ право
glVertex2d( 1.0f,-1.0f); // Bottom Right
glTexCoord2f(1.0f, 1.0f); //glVertex3f( 1.0f, 1.0f, 1.0f); // Верх право
glVertex2d( 1.0f, 1.0f); // Top Right
glTexCoord2f(0.0f, 1.0f); //glVertex3f(-1.0f, 1.0f, 1.0f); // Верх лево
glVertex2d(-1.0f, 1.0f); // Top Left
glEnd();
glPopMatrix();
SwapBuffers(hDC);
Sleep (1);
}
}
/* shutdown OpenGL */
DisableOpenGL(hwnd, hDC, hRC);
/* destroy the window explicitly */
DestroyWindow(hwnd);
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
}
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
/* get the device context (DC) */
*hDC = GetDC(hwnd);
/* set the pixel format for the DC */
ZeroMemory(&pfd, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat(*hDC, &pfd);
SetPixelFormat(*hDC, iFormat, &pfd);
/* create and enable the render context (RC) */
*hRC = wglCreateContext(*hDC);
wglMakeCurrent(*hDC, *hRC);
}
void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
{
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hRC);
ReleaseDC(hwnd, hDC);
}
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Dr.Evil за это полезное сообщение:
|
|
08.07.2011, 01:55
|
#7
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Рендер массива пикселей
Спасибо, поизучаю
|
(Offline)
|
|
08.07.2011, 02:05
|
#8
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Рендер массива пикселей
glDrawPixels же
or glTexSubImage2D
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:08.
|