ورود

View Full Version : سوال: مشکل با win32



amin1softco
چهارشنبه 01 آذر 1391, 11:21 صبح
قطعه کد زیر محتویات پنجره که بوسیله glut درست شده به یک بیتمپ میده و قراره این بیتمپ در layered windows (http://msdn.microsoft.com/en-us/library/ms997507.aspx) استفاده بشه ولی یک صفحه مشکی فقط نمایش داده می شود...
این کد مشکلش چیه ؟ که فقط یک صفحه مشکی نشون میده /؟

static std::vector<unsigned char> data(ClientWidth*ClientHeight*4);
static std::vector<unsigned char> data2(ClientWidth*ClientHeight*4);


glReadPixels(0, 0, ClientWidth, ClientHeight, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);

// m_frameRenderPass.endPass();

// convert the data for windows
int w = ClientWidth;
int h = ClientHeight;
for (int j=0; j<h; ++j) {
int j2 = h-j-1;
unsigned char *p1 = &data[0] + 4*j2*w;
unsigned char *p2 = &data2[0] + 4*j*w;
for (int i=0; i<w; ++i)
{
*p2 = *(p1+2);
*(p2+1) = *(p1+1);
*(p2+2) = *p1;
*(p2+3) = *(p1+3);
p1 += 4;
p2 += 4;
}
}

// copy the image data to the window
HDC dc = GetDC(0);
hMemDC=deviceContext;
HBITMAP hBMP = CreateBitmap(w, h, 1, 32, &data2[0]);
HBITMAP bmpold = (HBITMAP)SelectObject(hMemDC, hBMP);
SIZE sz = {w, h};
POINT ptSrc = {0,0};
Alpha += UpDown ? 1 : -1;
if (Alpha > 255 || Alpha < 0) {
UpDown = !UpDown;
Alpha += UpDown ? 1 : -1;
}
BLENDFUNCTION blend;
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.AlphaFormat =0/*AC_SRC_ALPHA*/;
blend.SourceConstantAlpha = Alpha;

if (!UpdateLayeredWindow(Handle,dc, 0, &sz, hMemDC, &ptSrc, 0, &blend, ULW_ALPHA))
printf("UpdateLayeredWindow failed\n");
SelectObject(hMemDC, bmpold);
DeleteObject(hBMP);

....

SeganX
چهارشنبه 01 آذر 1391, 12:58 عصر
سلام

من یه قسمت هایی از کدت رو اصلاح کردم

اشتباهایی که داشتی این بود که وقتی می خوای بافر رو توی یک بیتمپ بریزی دیگه نیازی نیست swapBuffers کنی. دیگه اینکه واسه بیتمپ ی که ساخته بودی باید یک dc هم می ساختی که بتونی محتویات بیتمپت رو پاس بدی به updatelayerdwindow اما تو deviceContext رو پاس داده بودی.

این کد کار می کنه اما اگه می خوای کاملتر باشه باید طوری صحنه رو با جی ال بکشی که بافر نهاییت الفا داشته باشه و جاهایی که الفا نداره رو مشکلی کنی یا اینکه از BlendOp های دیگه استفاده کنی.

من برای نمایش بهتر از glClearColor استفاده کردم که بکت مشکلی بشه و دیگه اینکه آلفای بیتمپ هم دستی ست کردم که تاثیر محسوس باشه



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

glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.10, 0.100,0.10); //line colour set to blue
glRasterPos2f(0, 0);
glBitmap(422, 40, 0.0f, 0.0, 0.0, 0.0,(const GLubyte*)rawData);
glRasterPos2f(100, 100);
glCopyPixels((53*co),0,53,53,GL_COLOR);
glRasterPos2f(155, 100);
glCopyPixels((53*co2),0,53,53,GL_COLOR);

if(co>7)co=0;
if(co2++>7)co2=0;

frame++;
time=glutGet(GLUT_ELAPSED_TIME);
printf("FPS:%4.2f\nalpha:%d\n",fps,Alpha);

if (time - timebase > 1000) {
co++;
fps = float(frame*1000.0/(time-timebase));
timebase = time;
frame = 0;
}

// glutSwapBuffers();
glFlush(); //process all OGL functions immediately ???? ?? ???? ????

// ---- change translucency

static std::vector<unsigned char> data(ClientWidth*ClientHeight*4);
static std::vector<unsigned char> data2(ClientWidth*ClientHeight*4);


glReadPixels(0, 0, ClientWidth, ClientHeight, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);

// m_frameRenderPass.endPass();

// convert the data for windows
int w = ClientWidth;
int h = ClientHeight;
for (int j=0; j<h; ++j) {
int j2 = h-j-1;
unsigned char *p1 = &data[0] + 4*j2*w;
unsigned char *p2 = &data2[0] + 4*j*w;
for (int i=0; i<w; ++i)
{
*p2 = *(p1+2);
*(p2+1) = *(p1+1);
*(p2+2) = *p1;
*(p2+3) = j % 255;//*(p1+3);
p1 += 4;
p2 += 4;
}
}

// copy the image data to the window
HDC dc = GetDC( Handle );
hMemDC = CreateCompatibleDC( dc );
//hMemDC=deviceContext;
HBITMAP hBMP = CreateBitmap(w, h, 1, 32, &data2[0]);
//HBITMAP bmpold = (HBITMAP)SelectObject(hMemDC, hBMP);
SelectObject(hMemDC, hBMP);
SIZE sz = {w, h};
POINT ptSrc = {0,0};

BLENDFUNCTION blend;
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.AlphaFormat = AC_SRC_ALPHA;
blend.SourceConstantAlpha = 255;//Alpha;

UpdateLayeredWindow(Handle, NULL, 0, &sz, hMemDC, &ptSrc, 0, &blend, ULW_ALPHA);

DeleteObject(hMemDC);
DeleteObject(hBMP);
ReleaseDC(0, dc);


}

amin1softco
چهارشنبه 01 آذر 1391, 14:24 عصر
مرسی خیلی کمک بزرگی کردی من یکمی دیگه تغییرش دادم که دقیقاً کاری را که می خوام انجام بده... ولی آخرش نفهمیدم چرا swap را حذف کردیم ؟
95353

glReadPixels(0, 0, ClientWidth, ClientHeight, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);


// convert the data for windows
int w = ClientWidth;
int h = ClientHeight;
for (int j=0; j<h; ++j) {
int j2 = h-j-1;
unsigned char *p1 = &data[0] + 4*j2*w;
unsigned char *p2 = &data2[0] + 4*j*w;
for (int i=0; i<w; ++i)
{
*p2 = *(p1+2);
*(p2+1) = *(p1+1);
*(p2+2) = *p1;
*(p2+3) = *(p1+3);

*(p2+3) = 255;
if ((*(p2+1) == 0) && (*(p2+2) == 0) && (*(p2) == 0)) {
*(p2+3) = 0;
}
p1 += 4;
p2 += 4;
}
}

// copy the image data to the window
HDC dc = GetDC( Handle );
hMemDC = CreateCompatibleDC( dc );
HBITMAP hBMP = CreateBitmap(w, h, 1, 32, &data2[0]);
SelectObject(hMemDC, hBMP);
SIZE sz = {w, h};
POINT ptSrc = {0,0};
Alpha += UpDown ? 1 : -1;
if (Alpha > 255 || Alpha < 0) {
UpDown = !UpDown;
Alpha += UpDown ? 1 : -1;
}
BLENDFUNCTION blend;
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.AlphaFormat = AC_SRC_ALPHA;
blend.SourceConstantAlpha = Alpha;

UpdateLayeredWindow(Handle, NULL, 0, &sz, hMemDC, &ptSrc, 0, &blend, ULW_ALPHA);

DeleteObject(hMemDC);
DeleteObject(hBMP);
ReleaseDC(0, dc);

SeganX
چهارشنبه 01 آذر 1391, 15:51 عصر
وقتی swap می کنی بافرت رو بلیت می کنی توی دسکتاپ. از اونجا که ما می خوایم بافر رو بفرستیم توی یک بیتمپ دیگه swap نمی کنیم.