本文整理汇总了C++中qglBegin函数的典型用法代码示例。如果您正苦于以下问题:C++ qglBegin函数的具体用法?C++ qglBegin怎么用?C++ qglBegin使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了qglBegin函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GL_DrawAliasFrameLerp
//.........这里部分代码省略.........
{
qglColor4f( shadelight[0], shadelight[1], shadelight[2], alpha );
}
else
{
qglEnableClientState( GL_COLOR_ARRAY );
qglColorPointer( 3, GL_FLOAT, 0, colorArray );
//
// pre light everything
//
for ( i = 0; i < paliashdr->num_xyz; i++ )
{
float l = shadedots[verts[i].lightnormalindex];
colorArray[i*3+0] = l * shadelight[0];
colorArray[i*3+1] = l * shadelight[1];
colorArray[i*3+2] = l * shadelight[2];
}
}
if ( qglLockArraysEXT != 0 )
qglLockArraysEXT( 0, paliashdr->num_xyz );
while (1)
{
// get the vertex count and primitive type
count = *order++;
if (!count)
break; // done
if (count < 0)
{
count = -count;
qglBegin (GL_TRIANGLE_FAN);
}
else
{
qglBegin (GL_TRIANGLE_STRIP);
}
// PMM - added double damage shell
if ( currententity->flags & ( RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE | RF_SHELL_HALF_DAM) )
{
do
{
index_xyz = order[2];
order += 3;
qglVertex3fv( s_lerped[index_xyz] );
} while (--count);
}
else
{
do
{
// texture coordinates come from the draw list
qglTexCoord2f (((float *)order)[0], ((float *)order)[1]);
index_xyz = order[2];
order += 3;
// normals and vertexes come from the frame list
// l = shadedots[verts[index_xyz].lightnormalindex];
// qglColor4f (l* shadelight[0], l*shadelight[1], l*shadelight[2], alpha);
示例2: RB_ShadowFinish
/*
=================
RB_ShadowFinish
Darken everything that is is a shadow volume.
We have to delay this until everything has been shadowed,
because otherwise shadows from different body parts would
overlap and double darken.
=================
*/
void RB_ShadowFinish( void ) {
if ( r_shadows->integer != 2 ) {
return;
}
if ( glConfig.stencilBits < 4 ) {
return;
}
#ifdef _DEBUG_STENCIL_SHADOWS
return;
#endif
qglEnable( GL_STENCIL_TEST );
qglStencilFunc( GL_NOTEQUAL, 0, 255 );
qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
bool planeZeroBack = false;
if (qglIsEnabled(GL_CLIP_PLANE0))
{
planeZeroBack = true;
qglDisable (GL_CLIP_PLANE0);
}
GL_Cull(CT_TWO_SIDED);
//qglDisable (GL_CULL_FACE);
GL_Bind( tr.whiteImage );
qglPushMatrix();
qglLoadIdentity ();
// qglColor3f( 0.6f, 0.6f, 0.6f );
// GL_State( GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );
// qglColor3f( 1, 0, 0 );
// GL_State( GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
qglColor4f( 0.0f, 0.0f, 0.0f, 0.5f );
//GL_State( GLS_DEPTHMASK_TRUE | GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA );
GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA );
#ifdef HAVE_GLES
static GLfloat vtx[] = {
-100.0f, 100.0f, -10.0f,
100.0f, 100.0f, -10.0f,
100.0f, -100.0f, -10.0f,
-100.0f, -100.0f, -10.0f
};
GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
if (text)
qglDisableClientState(GL_TEXTURE_COORD_ARRAY);
if (glcol)
qglDisableClientState(GL_COLOR_ARRAY);
qglVertexPointer(3, GL_FLOAT, 0, vtx);
qglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
if (text)
qglEnableClientState(GL_TEXTURE_COORD_ARRAY);
if (glcol)
qglEnableClientState(GL_COLOR_ARRAY);
#else
qglBegin( GL_QUADS );
qglVertex3f( -100.0f, 100.0f, -10.0f);
qglVertex3f( 100.0f, 100.0f, -10.0f);
qglVertex3f( 100.0f, -100.0f, -10.0f);
qglVertex3f( -100.0f, -100.0f, -10.0f);
qglEnd();
#endif
qglColor4f(1,1,1,1);
qglDisable( GL_STENCIL_TEST );
if (planeZeroBack)
{
qglEnable (GL_CLIP_PLANE0);
}
qglPopMatrix();
}
示例3: RB_DistortionFill
void RB_DistortionFill(void)
{
float alpha = tr_distortionAlpha;
float spost = 0.0f;
float spost2 = 0.0f;
if ( glConfig.stencilBits < 4 )
{
return;
}
//ok, cap the stupid thing now I guess
if (!tr_distortionPrePost)
{
RB_CaptureScreenImage();
}
qglEnable(GL_STENCIL_TEST);
qglStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFF);
qglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
qglDisable (GL_CLIP_PLANE0);
GL_Cull( CT_TWO_SIDED );
//reset the view matrices and go into ortho mode
qglMatrixMode(GL_PROJECTION);
qglPushMatrix();
qglLoadIdentity();
qglOrtho(0, glConfig.vidWidth, glConfig.vidHeight, 32, -1, 1);
qglMatrixMode(GL_MODELVIEW);
qglPushMatrix();
qglLoadIdentity();
if (tr_distortionStretch)
{ //override
spost = tr_distortionStretch;
spost2 = tr_distortionStretch;
}
else
{ //do slow stretchy effect
spost = sin(tr.refdef.time * 0.0005 + tr.refdef.timeFraction * 0.0005);
if (spost < 0.0f)
{
spost = -spost;
}
spost *= 0.2f;
spost2 = sin(tr.refdef.time * 0.0005 + tr.refdef.timeFraction * 0.0005);
if (spost2 < 0.0f)
{
spost2 = -spost2;
}
spost2 *= 0.08f;
}
if (alpha != 1.0f)
{ //blend
GL_State(GLS_SRCBLEND_SRC_ALPHA|GLS_DSTBLEND_SRC_ALPHA);
}
else
{ //be sure to reset the draw state
GL_State(0);
}
#ifdef HAVE_GLES
qglColor4f(1.0f, 1.0f, 1.0f, alpha);
GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
if (!text)
qglEnableClientState(GL_TEXTURE_COORD_ARRAY);
if (glcol)
qglDisableClientState(GL_COLOR_ARRAY);
GLfloat tex[] = {
0 + spost2, 1 - spost,
0 + spost2, 0 + spost,
1 - spost2, 0 + spost,
1 - spost2, 1 - spost
};
GLfloat vtx[] = {
0, 0,
0, glConfig.vidHeight,
glConfig.vidWidth, glConfig.vidHeight,
glConfig.vidWidth, 0
};
qglTexCoordPointer(2, GL_FLOAT, 0, tex);
qglVertexPointer(2, GL_FLOAT, 0, vtx);
qglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
/* if (glcol)
qglEnableClientState( GL_COLOR_ARRAY );
if (!text)
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );*/
#else
qglBegin(GL_QUADS);
qglColor4f(1.0f, 1.0f, 1.0f, alpha);
qglTexCoord2f(0+spost2, 1-spost);
qglVertex2f(0, 0);
qglTexCoord2f(0+spost2, 0+spost);
qglVertex2f(0, glConfig.vidHeight);
//.........这里部分代码省略.........
示例4: yellow
void idSplineList::draw(bool editMode)
{
int i;
idVec4 yellow(1, 1, 0, 1);
if(controlPoints.Num() == 0)
{
return;
}
if(dirty)
{
buildSpline();
}
qglColor3fv(controlColor);
qglPointSize(5);
qglBegin(GL_POINTS);
for(i = 0; i < controlPoints.Num(); i++)
{
qglVertex3fv(*controlPoints[i]);
}
qglEnd();
if(editMode)
{
for(i = 0; i < controlPoints.Num(); i++)
{
glBox(activeColor, *controlPoints[i], 4);
}
}
//Draw the curve
qglColor3fv(pathColor);
qglBegin(GL_LINE_STRIP);
int count = splinePoints.Num();
for(i = 0; i < count; i++)
{
qglVertex3fv(*splinePoints[i]);
}
qglEnd();
if(editMode)
{
qglColor3fv(segmentColor);
qglPointSize(3);
qglBegin(GL_POINTS);
for(i = 0; i < count; i++)
{
qglVertex3fv(*splinePoints[i]);
}
qglEnd();
}
if(count > 0)
{
//assert(activeSegment >=0 && activeSegment < count);
if(activeSegment >= 0 && activeSegment < count)
{
glBox(activeColor, *splinePoints[activeSegment], 6);
glBox(yellow, *splinePoints[activeSegment], 8);
}
}
}
示例5: R_DrawAliasShadow
void
R_DrawAliasShadow ( dmdl_t *paliashdr, int posenum )
{
#if defined(VERTEX_ARRAYS)
uint16_t total;
GLenum type;
#endif
int *order;
vec3_t point;
float height, lheight;
int count;
lheight = currententity->origin [ 2 ] - lightspot [ 2 ];
height = 0;
order = (int *) ( (byte *) paliashdr + paliashdr->ofs_glcmds );
height = -lheight + 0.1f;
/* stencilbuffer shadows */
if ( have_stencil && gl_stencilshadow->value )
{
qglEnable( GL_STENCIL_TEST );
qglStencilFunc( GL_EQUAL, 1, 2 );
qglStencilOp( GL_KEEP, GL_KEEP, GL_INCR );
}
while ( 1 )
{
/* get the vertex count and primitive type */
count = *order++;
if ( !count )
{
break; /* done */
}
if ( count < 0 )
{
count = -count;
#if defined(VERTEX_ARRAYS)
type = GL_TRIANGLE_FAN;
#else
qglBegin( GL_TRIANGLE_FAN );
#endif
}
else
{
#if defined(VERTEX_ARRAYS)
type = GL_TRIANGLE_STRIP;
#else
qglBegin( GL_TRIANGLE_STRIP );
#endif
}
#if defined(VERTEX_ARRAYS)
total = count;
GLfloat vtx[3*total];
uint32_t index_vtx = 0;
#endif
do
{
/* normals and vertexes come from the frame list */
memcpy( point, s_lerped [ order [ 2 ] ], sizeof ( point ) );
point [ 0 ] -= shadevector [ 0 ] * ( point [ 2 ] + lheight );
point [ 1 ] -= shadevector [ 1 ] * ( point [ 2 ] + lheight );
point [ 2 ] = height;
#if defined(VERTEX_ARRAYS)
vtx[index_vtx++] = point [ 0 ];
vtx[index_vtx++] = point [ 1 ];
vtx[index_vtx++] = point [ 2 ];
#else
qglVertex3fv( point );
#endif
order += 3;
}
while ( --count );
#if defined(VERTEX_ARRAYS)
qglEnableClientState( GL_VERTEX_ARRAY );
qglVertexPointer( 3, GL_FLOAT, 0, vtx );
qglDrawArrays( type, 0, total );
qglDisableClientState( GL_VERTEX_ARRAY );
#else
qglEnd();
#endif
}
/* stencilbuffer shadows */
if ( have_stencil && gl_stencilshadow->value )
{
qglDisable( GL_STENCIL_TEST );
}
}
示例6: RE_StretchRaw
/*
=============
RE_StretchRaw
FIXME: not exactly backend
Stretches a raw 32 bit power of 2 bitmap image over the given screen rectangle.
Used for cinematics.
=============
*/
void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty) {
int i, j;
int start, end;
#ifdef VCMODS_OPENGLES
vec2_t texcoords[4];
vec2_t verts[4];
glIndex_t indicies[6] = {0, 1, 2, 0, 3, 2};
#endif
if ( !tr.registered ) {
return;
}
R_SyncRenderThread();
// we definately want to sync every frame for the cinematics
qglFinish();
start = end = 0;
if ( r_speeds->integer ) {
start = ri.Milliseconds();
}
// make sure rows and cols are powers of 2
for ( i = 0 ; ( 1 << i ) < cols ; i++ ) {
}
for ( j = 0 ; ( 1 << j ) < rows ; j++ ) {
}
if ( ( 1 << i ) != cols || ( 1 << j ) != rows) {
ri.Error (ERR_DROP, "Draw_StretchRaw: size not a power of 2: %i by %i", cols, rows);
}
GL_Bind( tr.scratchImage[client] );
// if the scratchImage isn't in the format we want, specify it as a new texture
if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
#ifdef VCMODS_OPENGLES
//don't do qglTexImage2D as this may end up doing a compressed image
//on which we are not allowed to do further sub images
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
#else
qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
#endif
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
} else {
if (dirty) {
// otherwise, just subimage upload it so that drivers can tell we are going to be changing
// it and don't try and do a texture compression
qglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data );
}
}
if ( r_speeds->integer ) {
end = ri.Milliseconds();
ri.Printf( PRINT_ALL, "qglTexSubImage2D %i, %i: %i msec\n", cols, rows, end - start );
}
RB_SetGL2D();
#ifdef VCMODS_OPENGLES
qglColor4f( tr.identityLight, tr.identityLight, tr.identityLight, 1.0f );
verts[0][0] = x; verts[0][1] = y;
verts[1][0] = x+w; verts[1][1] = y;
verts[2][0] = x+w; verts[2][1] = y+h;
verts[3][0] = x; verts[3][1] = y+h;
texcoords[0][0] = 0.5f/cols; texcoords[0][1] = 0.5f/rows;
texcoords[1][0] = (cols-0.5f)/cols; texcoords[1][1] = 0.5f/rows;
texcoords[2][0] = (cols-0.5f)/cols; texcoords[2][1] = (rows-0.5f)/rows;
texcoords[3][0] = 0.5f/cols; texcoords[3][1] = (rows-0.5f)/rows;
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
qglTexCoordPointer( 2, GL_FLOAT, 0, texcoords );
qglVertexPointer ( 2, GL_FLOAT, 0, verts );
qglDrawElements( GL_TRIANGLE_STRIP, 6, GL_INDEX_TYPE, indicies );
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
#else
qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
qglBegin (GL_QUADS);
qglTexCoord2f ( 0.5f / cols, 0.5f / rows );
qglVertex2f (x, y);
qglTexCoord2f ( ( cols - 0.5f ) / cols , 0.5f / rows );
qglVertex2f (x+w, y);
qglTexCoord2f ( ( cols - 0.5f ) / cols, ( rows - 0.5f ) / rows );
qglVertex2f (x+w, y+h);
//.........这里部分代码省略.........
示例7: R_RenderShadowEdges
void R_RenderShadowEdges( void ) {
int i;
#if 0
int numTris;
// dumb way -- render every triangle's edges
numTris = tess.numIndexes / 3;
for ( i = 0 ; i < numTris ; i++ ) {
int i1, i2, i3;
if ( !facing[i] ) {
continue;
}
i1 = tess.indexes[ i*3 + 0 ];
i2 = tess.indexes[ i*3 + 1 ];
i3 = tess.indexes[ i*3 + 2 ];
qglBegin( GL_TRIANGLE_STRIP );
qglVertex3fv( tess.xyz[ i1 ] );
qglVertex3fv( tess.xyz[ i1 + tess.numVertexes ] );
qglVertex3fv( tess.xyz[ i2 ] );
qglVertex3fv( tess.xyz[ i2 + tess.numVertexes ] );
qglVertex3fv( tess.xyz[ i3 ] );
qglVertex3fv( tess.xyz[ i3 + tess.numVertexes ] );
qglVertex3fv( tess.xyz[ i1 ] );
qglVertex3fv( tess.xyz[ i1 + tess.numVertexes ] );
qglEnd();
}
#else
int c, c2;
int j, k;
int i2;
int c_edges, c_rejected;
int hit[2];
// an edge is NOT a silhouette edge if its face doesn't face the light,
// or if it has a reverse paired edge that also faces the light.
// A well behaved polyhedron would have exactly two faces for each edge,
// but lots of models have dangling edges or overfanned edges
c_edges = 0;
c_rejected = 0;
for ( i = 0 ; i < tess.numVertexes ; i++ ) {
c = numEdgeDefs[ i ];
for ( j = 0 ; j < c ; j++ ) {
if ( !edgeDefs[ i ][ j ].facing ) {
continue;
}
hit[0] = 0;
hit[1] = 0;
i2 = edgeDefs[ i ][ j ].i2;
c2 = numEdgeDefs[ i2 ];
for ( k = 0 ; k < c2 ; k++ ) {
if ( edgeDefs[ i2 ][ k ].i2 == i ) {
hit[ edgeDefs[ i2 ][ k ].facing ]++;
}
}
// if it doesn't share the edge with another front facing
// triangle, it is a sil edge
if ( hit[ 1 ] == 0 ) {
qglBegin( GL_TRIANGLE_STRIP );
qglVertex3fv( tess.xyz[ i ] );
qglVertex3fv( tess.xyz[ i + tess.numVertexes ] );
qglVertex3fv( tess.xyz[ i2 ] );
qglVertex3fv( tess.xyz[ i2 + tess.numVertexes ] );
qglEnd();
c_edges++;
} else {
c_rejected++;
}
}
}
#endif
}
示例8: R_DrawSkyBox
void R_DrawSkyBox (void)
{
int i;
#if 0
qglEnable (GL_BLEND);
GL_TexEnv( GL_MODULATE );
qglColor4f (1,1,1,0.5);
qglDisable (GL_DEPTH_TEST);
#endif
// jkrige - skybox
qglDisable (GL_DEPTH_TEST);
/*if (skyrotate)
{ // check for no sky at all
for (i=0 ; i<6 ; i++)
if (skymins[0][i] < skymaxs[0][i]
&& skymins[1][i] < skymaxs[1][i])
break;
if (i == 6)
return; // nothing visible
}*/
// jkrige - skybox
qglPushMatrix ();
qglTranslatef (r_origin[0], r_origin[1], r_origin[2]);
qglRotatef (r_newrefdef.time * skyrotate, skyaxis[0], skyaxis[1], skyaxis[2]);
for (i=0 ; i<6 ; i++)
{
// jkrige - skybox
/*if (skyrotate)
{ // hack, forces full sky to draw when rotating
skymins[0][i] = -1;
skymins[1][i] = -1;
skymaxs[0][i] = 1;
skymaxs[1][i] = 1;
}
if (skymins[0][i] >= skymaxs[0][i]
|| skymins[1][i] >= skymaxs[1][i])
continue;*/
// jkrige - skybox
GL_Bind (sky_images[skytexorder[i]]->texnum);
qglBegin (GL_QUADS);
// jkrige - skybox
MakeSkyVec (-1, -1, i);
MakeSkyVec (-1, 1, i);
MakeSkyVec (1, 1, i);
MakeSkyVec (1, -1, i);
//MakeSkyVec (skymins[0][i], skymins[1][i], i);
//MakeSkyVec (skymins[0][i], skymaxs[1][i], i);
//MakeSkyVec (skymaxs[0][i], skymaxs[1][i], i);
//MakeSkyVec (skymaxs[0][i], skymins[1][i], i);
// jkrige - skybox
qglEnd ();
}
qglPopMatrix ();
#if 0
glDisable (GL_BLEND);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor4f (1,1,1,0.5);
glEnable (GL_DEPTH_TEST);
#endif
// jkrige - skybox
qglEnable (GL_DEPTH_TEST);
// jkrige - skybox
}
示例9: RE_StretchRaw
/*
=============
RE_StretchRaw
FIXME: not exactly backend
Stretches a raw 32 bit power of 2 bitmap image over the given screen rectangle.
Used for cinematics.
=============
*/
void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty) {
int i, j;
int start, end;
if ( !tr.registered ) {
return;
}
R_SyncRenderThread();
#ifdef FRAMEBUFFER_AND_GLSL_SUPPORT
// Needed here to support cinematics
R_FrameBuffer_EndFrame();
#endif
// we definately want to sync every frame for the cinematics
qglFinish();
start = end = 0;
if ( r_speeds->integer ) {
start = ri.Milliseconds();
}
// make sure rows and cols are powers of 2
for ( i = 0 ; ( 1 << i ) < cols ; i++ ) {
}
for ( j = 0 ; ( 1 << j ) < rows ; j++ ) {
}
if ( ( 1 << i ) != cols || ( 1 << j ) != rows) {
ri.Error (ERR_DROP, "Draw_StretchRaw: size not a power of 2: %i by %i", cols, rows);
}
GL_Bind( tr.scratchImage[client] );
// if the scratchImage isn't in the format we want, specify it as a new texture
if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
} else {
if (dirty) {
// otherwise, just subimage upload it so that drivers can tell we are going to be changing
// it and don't try and do a texture compression
qglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data );
}
}
if ( r_speeds->integer ) {
end = ri.Milliseconds();
ri.Printf( PRINT_ALL, "qglTexSubImage2D %i, %i: %i msec\n", cols, rows, end - start );
}
RB_SetGL2D();
qglColor3f( tr.identityLight, tr.identityLight, tr.identityLight );
qglBegin (GL_QUADS);
qglTexCoord2f ( 0.5f / cols, 0.5f / rows );
qglVertex2f (x, y);
qglTexCoord2f ( ( cols - 0.5f ) / cols , 0.5f / rows );
qglVertex2f (x+w, y);
qglTexCoord2f ( ( cols - 0.5f ) / cols, ( rows - 0.5f ) / rows );
qglVertex2f (x+w, y+h);
qglTexCoord2f ( 0.5f / cols, ( rows - 0.5f ) / rows );
qglVertex2f (x, y+h);
qglEnd ();
}
示例10: DrawRuledSurface
/*
===============
DrawRuledSurface
===============
*/
void DrawRuledSurface (face_t *cf, float ctrl[2][3][5] ) {
int j, k, l;
vec5_t curve[2][CBLOCK_SUBDIVISIONS+1];
//float u;
float *v;
if (curveFile) {
fprintf (curveFile, "RULED {\n");
fprintf (curveFile, "textures/%s\n", cf->texdef.name);
Write3DMatrix (curveFile, 2, 3, 5, (float *)ctrl);
fprintf (curveFile, "}\n");
return;
}
for (j = 0 ; j < 2 ; j++) {
for (l = 0 ; l < 5 ; l++) {
float a, b, c;
float qA, qB, qC;
float f;
int k;
a = ctrl[j][0][l];
b = ctrl[j][1][l];
c = ctrl[j][2][l];
qA = a - 2 * b + c;
qB = 2 * b - 2 * a;
qC = a;
for (k = 0 ; k <= CBLOCK_SUBDIVISIONS ; k++) {
f = (float)k / CBLOCK_SUBDIVISIONS;
curve[j][k][l] = qA*f*f + qB*f + qC;
}
}
}
if ( bevelBrush ) {
face_t *f;
for (k = 0 ; k < CBLOCK_SUBDIVISIONS ; k++) {
f = Face_Clone( bevelBrush->brush_faces );
f->texdef.flags |= SURF_CURVE_FAKE;
f->next = bevelBrush->brush_faces;
bevelBrush->brush_faces = f;
VectorCopy( curve[0][k], f->planepts[0] );
VectorCopy( curve[1][k], f->planepts[1] );
VectorCopy( curve[0][k+1], f->planepts[2] );
Brush_MakeFacePlane( f );
}
return;
}
qglBindTexture (GL_TEXTURE_2D, cf->d_texture->texture_number);
float fColor[3];
SetColor(cf, fColor);
qglBegin (GL_QUAD_STRIP);
for (k = 0 ; k <= CBLOCK_SUBDIVISIONS ; k++) {
v = curve[0][k];
qglTexCoord2fv( v + 3 );
qglVertex3fv( v );
v = curve[1][k];
qglTexCoord2fv( v + 3 );
qglVertex3fv( v );
}
qglEnd ();
}
示例11: DrawPatch
/*
===================
DrawPatch
===================
*/
void DrawPatch (face_t *cf, float ctrl[3][3][5]) {
int i, j;
float u, v;
vec5_t verts[CBLOCK_SUBDIVISIONS+1][CBLOCK_SUBDIVISIONS+1];
if (curveFile) {
fprintf (curveFile, "PATCH {\n");
fprintf (curveFile, "textures/%s\n", cf->texdef.name);
Write3DMatrix (curveFile, 3, 3, 5, (float *)ctrl);
fprintf (curveFile, "}\n");
return;
}
for (i = 0 ; i <= CBLOCK_SUBDIVISIONS ; i++) {
for (j = 0 ; j <= CBLOCK_SUBDIVISIONS ; j++) {
u = (float)i / CBLOCK_SUBDIVISIONS;
v = (float)j / CBLOCK_SUBDIVISIONS;
SamplePatch (ctrl, u, v, verts[i][j]);
}
}
if ( bevelBrush ) {
face_t *f;
vec3_t v0, v1, v2;
vec3_t d1, d2, cross;
for (i = 0 ; i < CBLOCK_SUBDIVISIONS ; i++) {
for (j = 0 ; j < CBLOCK_SUBDIVISIONS ; j++) {
VectorCopy( verts[i][j], v0 );
VectorCopy( verts[i][j+1], v1 );
VectorCopy( verts[i+1][j], v2 );
VectorSubtract( v0, v1, d1 );
VectorSubtract( v2, v1, d2 );
CrossProduct( d1, d2, cross );
if ( VectorLength( cross ) == 0 ) {
continue; // degenerate
}
f = Face_Clone( bevelBrush->brush_faces );
f->texdef.flags |= SURF_CURVE_FAKE;
VectorCopy( v0, f->planepts[0] );
VectorCopy( v1, f->planepts[1] );
VectorCopy( v2, f->planepts[2] );
Brush_MakeFacePlane( f );
f->next = bevelBrush->brush_faces;
bevelBrush->brush_faces = f;
}
}
return;
}
qglBindTexture (GL_TEXTURE_2D, cf->d_texture->texture_number);
float fColor[3];
SetColor(cf, fColor);
for (i = 0 ; i < CBLOCK_SUBDIVISIONS ; i++) {
qglBegin (GL_QUAD_STRIP);
for (j = 0 ; j <= CBLOCK_SUBDIVISIONS ; j++) {
qglTexCoord2fv( verts[i+1][j] + 3 );
qglVertex3fv( verts[i+1][j] );
qglTexCoord2fv( verts[i][j] + 3 );
qglVertex3fv( verts[i][j] );
DecColor(fColor);
}
qglEnd ();
}
}
示例12: DrawCurveFan
/*
===============
DrawCurveFan
Draws a curve as part of a flat surface
===============
*/
void DrawCurveFan (face_t *cf, vec5_t opposite, vec5_t prev, vec5_t peak, vec5_t next) {
int i, k, l;
float coef[5][3];
// write it out
if (curveFile) {
vec5_t vecs[4];
for ( i = 0 ; i < 5 ; i++ ) {
vecs[0][i] = opposite[i];
vecs[1][i] = prev[i];
vecs[2][i] = peak[i];
vecs[3][i] = next[i];
}
fprintf (curveFile, "CURVEFAN {\n");
fprintf (curveFile, "textures/%s\n", cf->texdef.name);
Write2DMatrix (curveFile, 4, 5, (float *)vecs);
fprintf (curveFile, "}\n");
return;
}
// calculate the coefficients
for (l = 0 ; l < 5 ; l++) {
float a, b, c;
a = prev[l];
b = peak[l];
c = next[l];
coef[l][0] = a;
coef[l][1] = 2 * b - 2 * a;
coef[l][2] = a - 2 * b + c;
}
// draw it
qglBindTexture (GL_TEXTURE_2D, cf->d_texture->texture_number);
float fColor[3];
SetColor(cf, fColor);
qglBegin (GL_TRIANGLE_FAN);
qglTexCoord2fv( opposite + 3 );
qglVertex3fv( opposite );
for ( k = 0 ; k <= CBLOCK_SUBDIVISIONS ; k++ ) {
vec5_t curve;
float f;
f = (float)k / CBLOCK_SUBDIVISIONS;
for ( l = 0 ; l < 5 ; l++ ) {
curve[l] = coef[l][2]*f*f + coef[l][1]*f + coef[l][0];
}
qglTexCoord2fv( curve + 3 );
qglVertex3fv( curve );
DecColor(fColor);
}
qglEnd ();
}
示例13: RB_ColorCorrect
void RB_ColorCorrect( void ) {
GLint loc;
GLenum target;
int width, height;
int shift;
float mul;
if ( !r_enablePostProcess->integer || !r_enableColorCorrect->integer || !glsl ) {
return;
}
GL_SelectTexture(0);
qglDisable(GL_TEXTURE_2D);
qglEnable(GL_TEXTURE_RECTANGLE_ARB);
target = GL_TEXTURE_RECTANGLE_ARB;
width = glConfig.vidWidth;
height = glConfig.vidHeight;
qglBindTexture(target, tr.backBufferTexture);
qglCopyTexSubImage2D(target, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight);
qglMatrixMode(GL_PROJECTION);
qglLoadIdentity();
qglMatrixMode(GL_MODELVIEW);
qglLoadIdentity();
RB_SetGL2D();
GL_State( GLS_DEPTHTEST_DISABLE );
qglUseProgramObjectARB(tr.colorCorrectSp);
loc = qglGetUniformLocationARB(tr.colorCorrectSp, "p_gammaRecip");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_gammaRecip", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)(1.0 / r_gamma->value));
//mul = r_overBrightBitsValue->value;
mul = r_overBrightBits->value;
if (mul < 0.0) {
mul = 0.0;
}
shift = tr.overbrightBits;
loc = qglGetUniformLocationARB(tr.colorCorrectSp, "p_overbright");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_overbright", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)((float)(1 << shift) * mul));
loc = qglGetUniformLocationARB(tr.colorCorrectSp, "p_contrast");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_contrast", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)r_contrast->value);
loc = qglGetUniformLocationARB(tr.colorCorrectSp, "backBufferTex");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get backBufferTex", __FUNCTION__);
}
qglUniform1iARB(loc, 0);
qglBegin(GL_QUADS);
qglTexCoord2i(0, 0);
qglVertex2i(0, height);
qglTexCoord2i(width, 0);
qglVertex2i(width, height);
qglTexCoord2i(width, height);
qglVertex2i(width, 0);
qglTexCoord2i(0, height);
qglVertex2i(0, 0);
qglEnd();
qglUseProgramObjectARB(0);
qglDisable(GL_TEXTURE_RECTANGLE_ARB);
qglEnable(GL_TEXTURE_2D);
}
示例14: RB_BloomCombine
static void RB_BloomCombine( void ) {
GLenum target;
int width, height;
GLint loc;
GL_SelectTexture(0);
qglDisable(GL_TEXTURE_2D);
qglEnable(GL_TEXTURE_RECTANGLE_ARB);
target = GL_TEXTURE_RECTANGLE_ARB;
width = tr.bloomWidth;
height = tr.bloomHeight;
qglBindTexture(target, tr.bloomTexture);
qglCopyTexSubImage2D(target, 0, 0, 0, 0, glConfig.vidHeight - height, width, height);
qglUseProgramObjectARB(tr.combineSp);
qglBindTexture(target, tr.backBufferTexture);
loc = qglGetUniformLocationARB(tr.combineSp, "backBufferTex");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get backBufferTex", __FUNCTION__);
}
qglUniform1iARB(loc, 0);
GL_SelectTexture(1);
qglDisable(GL_TEXTURE_2D);
qglEnable(GL_TEXTURE_RECTANGLE_ARB);
qglBindTexture(target, tr.bloomTexture);
loc = qglGetUniformLocationARB(tr.combineSp, "bloomTex");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get bloomTex", __FUNCTION__);
}
qglUniform1iARB(loc, 1);
loc = qglGetUniformLocationARB(tr.combineSp, "p_bloomsaturation");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_bloomsaturation", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)r_BloomSaturation->value);
loc = qglGetUniformLocationARB(tr.combineSp, "p_scenesaturation");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_scenesaturation", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)r_BloomSceneSaturation->value);
loc = qglGetUniformLocationARB(tr.combineSp, "p_bloomintensity");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_bloomintensity", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)r_BloomIntensity->value);
loc = qglGetUniformLocationARB(tr.combineSp, "p_sceneintensity");
if (loc < 0) {
Com_Error(ERR_DROP, "%s() couldn't get p_sceneintensity", __FUNCTION__);
}
qglUniform1fARB(loc, (GLfloat)r_BloomSceneIntensity->value);
width = glConfig.vidWidth;
height = glConfig.vidHeight;
qglBegin(GL_QUADS);
qglMultiTexCoord2iARB(GL_TEXTURE0_ARB, 0, 0);
qglMultiTexCoord2iARB(GL_TEXTURE1_ARB, 0, 0);
qglVertex2i(0, height);
qglMultiTexCoord2iARB(GL_TEXTURE0_ARB, width, 0);
qglMultiTexCoord2iARB(GL_TEXTURE1_ARB, tr.bloomWidth, 0);
qglVertex2i(width, height);
qglMultiTexCoord2iARB(GL_TEXTURE0_ARB, width, height);
qglMultiTexCoord2iARB(GL_TEXTURE1_ARB, tr.bloomWidth, tr.bloomHeight);
qglVertex2i(width, 0);
qglMultiTexCoord2iARB(GL_TEXTURE0_ARB, 0, height);
qglMultiTexCoord2iARB(GL_TEXTURE1_ARB, 0, tr.bloomHeight);
qglVertex2i(0, 0);
qglEnd();
qglUseProgramObjectARB(0);
GL_SelectTexture(1);
qglDisable(GL_TEXTURE_RECTANGLE_ARB);
qglDisable(GL_TEXTURE_2D);
GL_SelectTexture(0);
qglDisable(GL_TEXTURE_RECTANGLE_ARB);
qglEnable(GL_TEXTURE_2D);
}
示例15: CreateOptTri
/*
===============
CreateOptTri
===============
*/
static void CreateOptTri( optVertex_t *first, optEdge_t *e1, optEdge_t *e2, optIsland_t *island ) {
optEdge_t *opposite;
optVertex_t *second, *third;
optTri_t *optTri;
mapTri_t *tri;
if ( e1->v1 == first ) {
second = e1->v2;
} else if ( e1->v2 == first ) {
second = e1->v1;
} else {
common->Error( "CreateOptTri: mislinked edge" );
return;
}
if ( e2->v1 == first ) {
third = e2->v2;
} else if ( e2->v2 == first ) {
third = e2->v1;
} else {
common->Error( "CreateOptTri: mislinked edge" );
return;
}
if ( !IsTriangleValid( first, second, third ) ) {
common->Error( "CreateOptTri: invalid" );
return;
}
//DrawEdges( island );
// identify the third edge
if ( dmapGlobals.drawflag ) {
qglColor3f(1,1,0);
qglBegin( GL_LINES );
qglVertex3fv( e1->v1->pv.ToFloatPtr() );
qglVertex3fv( e1->v2->pv.ToFloatPtr() );
qglEnd();
qglFlush();
qglColor3f(0,1,1);
qglBegin( GL_LINES );
qglVertex3fv( e2->v1->pv.ToFloatPtr() );
qglVertex3fv( e2->v2->pv.ToFloatPtr() );
qglEnd();
qglFlush();
}
for ( opposite = second->edges ; opposite ; ) {
if ( opposite != e1 && ( opposite->v1 == third || opposite->v2 == third ) ) {
break;
}
if ( opposite->v1 == second ) {
opposite = opposite->v1link;
} else if ( opposite->v2 == second ) {
opposite = opposite->v2link;
} else {
common->Error( "BuildOptTriangles: mislinked edge" );
return;
}
}
if ( !opposite ) {
common->Printf( "Warning: BuildOptTriangles: couldn't locate opposite\n" );
return;
}
if ( dmapGlobals.drawflag ) {
qglColor3f(1,0,1);
qglBegin( GL_LINES );
qglVertex3fv( opposite->v1->pv.ToFloatPtr() );
qglVertex3fv( opposite->v2->pv.ToFloatPtr() );
qglEnd();
qglFlush();
}
// create new triangle
optTri = (optTri_t *)Mem_Alloc( sizeof( *optTri ), TAG_DMAP );
optTri->v[0] = first;
optTri->v[1] = second;
optTri->v[2] = third;
optTri->midpoint = ( optTri->v[0]->pv + optTri->v[1]->pv + optTri->v[2]->pv ) * ( 1.0f / 3.0f );
optTri->next = island->tris;
island->tris = optTri;
if ( dmapGlobals.drawflag ) {
qglColor3f( 1, 1, 1 );
qglPointSize( 4 );
qglBegin( GL_POINTS );
qglVertex3fv( optTri->midpoint.ToFloatPtr() );
qglEnd();
qglFlush();
}
// find the midpoint, and scan through all the original triangles to
// see if it is inside any of them
//.........这里部分代码省略.........