Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Color transparente

Iniciado por McBain, 13 de Junio de 2006, 01:40:29 PM

« anterior - próximo »

McBain

Estoy aprendiendo directX 9, y  quería saber si sabeis como puedo decirle que cuando pinte un surface no pinte un color (es decir como el color transparente de un gif). Lo máximo que he conseguido hasta ahora es que cuando cargo una imagen de un fichero, un color elegido pasa a ser negro, pero nada más.
Saludos

zupervaca

Antes de renderizar la primitiva debes de activar el blend e indicar sus valores, algo asi:

device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );


Editado: Buscando algun link para pasarte he encontrado esta web: http://www.eggheadcafe.com/forumarchives/win32programmerdirectxgraphics/

MA]Mestre

Vaya por delante que no formo parte del lado oscuro... ...pico en Ogl... pero vamos flipo en colores si para hacer un AlphaTest, q pase un pixel o no.. Dx necesita usar BLENDING... lol lol lol ( icono-borracho )

zupervaca

Se puede hacer mediante un test alfa, pero segun la documentacion puede que no este soportado por todo el hardware con lo que creo que es mejor asegurarse de que funcione, ademas este es el sistema de toda la vida para crear transparencias teniendo un canal alfa.

MA]Mestre

HRESULT D3DXLoadSurfaceFromResource(
 LPDIRECT3DSURFACE9 pDestSurface,
 CONST PALETTEENTRY * pDestPalette,
 CONST RECT * pDestRect,
 HMODULE hSrcModule,
 LPCTSTR pSrcResource,
 CONST RECT * pSrcRect,
 DWORD Filter,
 D3DCOLOR ColorKey,
 D3DXIMAGE_INFO * pSrcInfo
);



ColorKey
[in] D3DCOLOR value to replace with transparent black, or 0 to disable the colorkey. This is always a 32-bit ARGB color, independent of the source image format. Alpha is significant and should usually be set to FF for opaque color keys Thus, for opaque black, the value would be equal to 0xFF000000.

Quieres decir que no es esto ?

Me tratas de explicar que un hardware que no soporta Alpha Test soportará  Alpha Blending ? lol lol lol ( icono - borracho )

el sistema de toda la vida ?  :shock:

zupervaca

Informate mejor antes de comenzar a criticar: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/directx9_c_summer_03/directx/graphics/programmingguide/GettingStarted/Direct3DDevices/States/renderstates/alphatestingstate.asp
En concreto este trozo es el que yo digo
CitarNot all hardware supports all alpha-testing features

La funcion que indicas sirve para leer una textura y modificar el canal alfa segun el color que le indiques, esa funcion es la que usa McBain para leer las texturas, pero lo que el no sabia era como hacer que efectivamente funcionara el color de transparencia, para ello con usar el codigo que le he puesto estaria.

MA]Mestre

CitarMe tratas de explicar que un hardware que no soporta Alpha Test soportará Alpha Blending ?  

Que parte de la pregunta no entiendes ?

Te criticaré con el mismo morro que tu dices estupideces con tanta soberbia. Si encuentras algún hardware que SI soporte Alpha Blending y NO soporte Alpha Test, dejaré de escribir en estos foros para siempre... que estas dispuesto a jugarte tu ?

Dejaré de programar, y me dedicaré a criar pollos, conejos y cerdos, si demuestras que el BLENDING es el sistema de toda la vida para que no se pinte un color de pixel.

Por otro lado, el Alpha Test.

...
pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, true );
pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x01 );
pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
...

http://www.computersciencelab.com/Direct3DTut1.htm

zupervaca

CitarTe criticaré con el mismo morro que tu dices estupideces con tanta soberbia. Si encuentras algún hardware que SI soporte Alpha Blending y NO soporte Alpha Test, dejaré de escribir en estos foros para siempre... que estas dispuesto a jugarte tu ?
Creo que te estas alterando y no atiendes a razones, no es que diga yo estupideces, es que sencillamente lo dice la documentacion, no hay mas.

CitarNot all hardware supports all alpha-testing features. You can check the device capabilities by calling the IDirect3D9::GetDeviceCaps method. After retrieving the device capabilities, check the associated D3DCAPS9 structure's AlphaCmpCaps member for the desired comparison function. If the AlphaCmpCaps member contains only the D3DPCMPCAPS_ALWAYS capability or only the D3DPCMPCAPS_NEVER capability, the driver does not support alpha tests

Y respecto a tu pregunta sencillamente no se responderte ya que yo nunca he dicho que pueda existir uno sin el otro, pero si miras la documentacion veras que sobre el alpha blending no se indica nada de que no pueda ser soportado por todo el hardware (o por lo menos no lo he visto), yo solo me remito a la documentacion, asi que soberbia no tengo, el problema lo tienes tu.

tamat

pero ma]mestre, acaso en OGL no hay que activar blending para que haga alphatest al pintar un quad? es que es igual que en DX
Por un stratos menos tenso

MA]Mestre

A.- Alpha Test
B.- Blending

B no puede existir, si no exite previamente A.

Conclusión:

Si A no es soportado por el harware, B tampoco lo será.

---

Es una estupidez recomendar el uso de BLENDING cuando el ALPHA TEST resuelve el problema infitamente más rápido.

---

Es una estupidez más grande decir que el BLENDING es el sistema de toda la vida para que no se pinte un color de pixel, simplemente pq es mentira. Aunque supongo q esto ya lo asumes, pq no dices nada en tu último post.

[EX3]

Cita de: "MAMestre"]Es una estupidez más grande decir que el BLENDING es el sistema de toda la vida para que no se pinte un color de pixel, simplemente pq es mentira. Aunque supongo q esto ya lo asumes, pq no dices nada en tu último post.
Que quieres que te diga, no se como seria antes, y cuando digo antes digo hace 10 años a lo poco, por que los 6 que llevo empollandome Direct3D (desde DirectX7) todos los ejemplo tiran de Blending para hacer alphablending y asignacion de color transparente o Colorkey en la textura, el AlphaTest los pocos ejemplos que lo implementan (que da la casualidad que son 2 del SDK) lo traen como opcional y con previa comprobacion de si es o no soportado por la tarjeta, cosa que con el Blending jamas he visto hacer.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

MA]Mestre

Cita de: "tamat"pero ma]mestre, acaso en OGL no hay que activar blending para que haga alphatest al pintar un quad?

No tamat.

//www.m3str3.org/AlphaTest.rar



#include <windows.h>
#include <stdio.h>
#include <gl\gl.h>
#include <gl\glu.h>


#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")


int BeginOpenGL (HWND hWnd);
void Render (void);
void SetDCPixelFormat (HDC hdc);
void LoadSprite (const char *ruta,short ancho,short alto,GLubyte **sprite);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM );
HINSTANCE hInst;

GLuint ntexture;
int iLessGreater=GL_LESS;

int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR  lpCmdLine, int iCmdShow)
{
char nombre []="OpenGL";
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;

hInst=hInstance;
wndclass.cbSize=sizeof (wndclass);
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION);
wndclass.hIconSm=LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor=LoadCursor (NULL, IDI_APPLICATION);
wndclass.hbrBackground= (HBRUSH ) GetStockObject ( WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=nombre;


RegisterClassEx (&wndclass);

hWnd=CreateWindowEx ( NULL,
nombre,
"OpenGL",
WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE | WS_BORDER | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
600,
600,
NULL,
NULL,
hInstance,
NULL);

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}


LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static HGLRC hrc;
static HDC hdc;
static HANDLE hilo=NULL;
static float AnguloRotacion=0.0f;
DWORD w9x;

switch (iMsg)
{
case WM_CREATE:
hdc=GetDC(hWnd);
SetDCPixelFormat(hdc);
hrc=wglCreateContext (hdc);
wglMakeCurrent (hdc,hrc);
BeginOpenGL(hWnd);
return 0;
case WM_PAINT:
Render();
SwapBuffers (hdc);
return 0;
case WM_KEYDOWN:
if (iLessGreater==GL_LESS) iLessGreater=GL_GREATER;
else iLessGreater=GL_LESS;
return 0;
case WM_DESTROY:
wglMakeCurrent (hdc,NULL);
wglDeleteContext (hrc);
PostQuitMessage (0);
return 0;
}
return DefWindowProc ( hWnd, iMsg, wParam, lParam);
}

int BeginOpenGL (HWND hWnd)
{
static GLubyte *Unicornio,*Pwar;

glEnable (GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable ( GL_ALPHA_TEST );

glViewport (0,0,600,600);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f,1.0f, 1.0f, 800.0);

glClearColor(0.0f,0.0f,1.0f,0.0f);

LoadSprite ("pwar.bmp",128,128,&Unicornio);

glGenTextures(1, &ntexture);

glBindTexture(GL_TEXTURE_2D, ntexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, 128, 128, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,Unicornio);

free (Unicornio);
return 0;
}


void SetDCPixelFormat (HDC hdc)
{
int n;
PIXELFORMATDESCRIPTOR pfd;

memset (&pfd,0,sizeof(pfd));
pfd.nSize=sizeof (PIXELFORMATDESCRIPTOR);
pfd.nVersion=1;
pfd.dwFlags=PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType=PFD_TYPE_RGBA;
pfd.cColorBits=8;
pfd.cDepthBits=32;

n=ChoosePixelFormat (hdc,&pfd);

SetPixelFormat (hdc,n,&pfd);
}


void LoadSprite (const char *ruta,short ancho,short alto,GLubyte **sprite)
{
int tam=ancho*alto*3;
GLubyte *aux;
HANDLE fp;
DWORD b;
GLint i,j;

fp=CreateFile (ruta,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

*sprite=(GLubyte *)malloc(tam);
aux=(GLubyte *)malloc(ancho*alto*4);
SetFilePointer(fp,54,NULL,FILE_BEGIN);
ReadFile (fp,*sprite,tam,&b,NULL);

for (i=0,j=0;i<(ancho*alto*3);j++,i++)
{
if ( i % 3 == 0 && i!=0)
{
if (* (aux+j-1)<120 && *(aux+j-2)<120 && *(aux+j-3)<120 )
*(aux+j)=255;
else
*(aux+j)=0;
j++;
}
*(aux+j)=*((*sprite)+i);
}

free(*sprite);
*sprite=aux;

CloseHandle (fp);
}


void Render (void)
{
glMatrixMode(GL_MODELVIEW );
glLoadIdentity();
glTranslatef (0.0f,0.0f,-50.0f);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glAlphaFunc (iLessGreater, 0.5f);
glBindTexture(GL_TEXTURE_2D,ntexture);

glBegin (GL_TRIANGLE_STRIP );
glTexCoord2f(0.0f, 0.0f); glVertex3f (-10.0f,-10.0f,0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f (-10.0f,10.0f,0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f (10.0f,-10.0f,0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f (10.0f,10.0f,0.0f);
glEnd ();
}

McBain

Zupervaca, gracias por contestar. ¿Me permites hacer unas preguntas más?
El código no me funciona (algo habre hecho mal). Estoy trabajando en 2D y con surfaces, para que funcione, he  usar textures? O bien, es por el método en que dibujo las surfaces en pantalla, las dibujo usando StretchRect sobre el  backSurface?
Saludos,
y gracias por la atención

zupervaca

¿Podrias poner el codigo o el proyecto para descargar? Asi seria mas facil encontrar una solucion al problema.
Me parece que la funcion StretchRect no hace caso de los cambios de estados, pero no se decirtelo seguro ya que nunca la he usado, normalmente se usa la clase sprite de direct3dx o se implementa una renderizando con dos triangulos u otro tipo de primitivas que formen un cuadrado.


CitarAunque supongo q esto ya lo asumes, pq no dices nada en tu último post
Yo no asumo nada, ¿has hecho rutinas graficas en asm en la epoca de ms-dos o en otras plataformas? una comprobacion era mucho mas lenta que usar operaciones para pintar una imagen con mascara de color.

[EX3]

Cita de: "McBain"Estoy trabajando en 2D y con surfaces, para que funcione, he  usar textures? O bien, es por el método en que dibujo las surfaces en pantalla, las dibujo usando StretchRect sobre el  backSurface?
Que yo tenga entendido no se aplican efectos como transparencias ni rotaciones ni nada en concreto sobre surfaces, solo sobre texturas, a no ser que esto haya cambiado en DirectX9, claro.

Si estas tratando de hacer un motor 2D con D3D tendras que jugar con poligonos a los que aplicas la posicion, tamaño y angulo del sprite y aplicar sobre ello una textura sobre la que aplicas tintado, iluminacion, transparencias, espejados o lo que quieras. De esto suele haber muchos ejemplos en la red, tutoriales muy basicos.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.