// レンダリング HRESULT Render( void ) { HRESULT hr = S_OK; // 画面クリア float color[] = { 0.0f, 0.0f, 1.0f, 1.0f }; g_pImmediateContext->ClearRenderTargetView( g_pRTV, color ); // サンプラ・ラスタライザセット g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState ); g_pImmediateContext->RSSetState( g_pRS ); // 描画設定 UINT nStrides = sizeof( CUSTOMVERTEX ); UINT nOffsets = 0; g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets ); g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); g_pImmediateContext->IASetInputLayout( g_pInputLayout ); // シェーダ設定 g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges ); g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); // 描画 g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); DrawPicture( 0.0f, 0.0f, &g_tBack ); g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF ); DrawPicture( x, y, &g_tBall ); // 表示 FlushDrawingPictures(); return S_OK; }
// レンダリング HRESULT Render( void ) { // int i, j; // 画面クリア XMFLOAT4 v4Color = XMFLOAT4( 0.0f, 0.0f, 1.0f, 1.0f ); g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color ); // サンプラ・ラスタライザセット g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState ); g_pImmediateContext->RSSetState( g_pRS ); // 描画設定 UINT nStrides = sizeof( CUSTOMVERTEX ); UINT nOffsets = 0; g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets ); // g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_POINTLIST ); g_pImmediateContext->IASetInputLayout( g_pInputLayout ); // シェーダ設定 g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges ); g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); // 描画 g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); RenderScanLine(); // DrawPicture( 0.0f, 0.0f, &g_tBack ); // 表示 FlushDrawingPictures(); return S_OK; }
// 絵の描画 int DrawPicture( float x, float y, TEX_PICTURE *pTexPic ) { if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1; // 頂点がバッファからあふれる場合は描画せず // テクスチャが切り替えられていれば待ち行列フラッシュ if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) { FlushDrawingPictures(); } // 頂点セット g_cvVertices[g_nVertexNum + 0].v4Pos = XMFLOAT4( x, y, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v2UV = XMFLOAT2( 0.0f, 0.0f ); g_cvVertices[g_nVertexNum + 1].v4Pos = XMFLOAT4( x, y + pTexPic->nHeight, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v2UV = XMFLOAT2( 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Pos = XMFLOAT4( x + pTexPic->nWidth, y, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v2UV = XMFLOAT2( 1.0f, 0.0f ); g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1]; g_cvVertices[g_nVertexNum + 4].v4Pos = XMFLOAT4( x + pTexPic->nWidth, y + pTexPic->nHeight, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v2UV = XMFLOAT2( 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2]; g_nVertexNum += 6; g_pNowTexture = pTexPic->pSRViewTexture; return 0; }
// 그림 그리기 int DrawQuadranglePic( float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, TEX_PICTURE *pTexPic ) { if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1; // 정점이 버퍼에서 넘치면 그리지 않고 // 텍스처가 바뀌면 대기행렬 플러시 if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) { FlushDrawingPictures(); } // 정점 세트 g_cvVertices[g_nVertexNum + 0].v4Pos = XMFLOAT4( x1, y1, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v2UV = XMFLOAT2( 0.0f, 0.0f ); g_cvVertices[g_nVertexNum + 1].v4Pos = XMFLOAT4( x3, y3, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v2UV = XMFLOAT2( 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Pos = XMFLOAT4( x2, y2, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v2UV = XMFLOAT2( 0.0f, 0.0f ); g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1]; g_cvVertices[g_nVertexNum + 4].v4Pos = XMFLOAT4( x4, y4, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v2UV = XMFLOAT2( 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2]; g_nVertexNum += 6; g_pNowTexture = pTexPic->pSRViewTexture; return 0; }
// 2Dポリゴンの描画 int Draw2DPolygon( float x1, float y1, float u1, float v1, float x2, float y2, float u2, float v2, float x3, float y3, float u3, float v3, TEX_PICTURE *pTexPic ) { if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 3 ) ) return -1; // 頂点がバッファからあふれる場合は描画せず // テクスチャが切り替えられていれば待ち行列フラッシュ if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) { FlushDrawingPictures(); } // 頂点セット g_cvVertices[g_nVertexNum + 0].v4Pos = XMFLOAT4( x1, y1, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v2UV = XMFLOAT2( u1, v1 ); g_cvVertices[g_nVertexNum + 1].v4Pos = XMFLOAT4( x2, y2, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v2UV = XMFLOAT2( u2, v2 ); g_cvVertices[g_nVertexNum + 2].v4Pos = XMFLOAT4( x3, y3, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v2UV = XMFLOAT2( u3, v3 ); g_nVertexNum += 3; g_pNowTexture = pTexPic->pSRViewTexture; return 0; }
// 그림 그리기 int DrawPicture( float x, float y, TEX_PICTURE *pTexPic ) { if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1; // 정점이 버퍼에서 넘치면 그리지 않고 // 텍스처가 바뀌면 대기 행렬 플러시 if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) { FlushDrawingPictures(); } // 정점 세트 g_cvVertices[g_nVertexNum + 0].v4Pos = XMFLOAT4( x, y, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v2UV = XMFLOAT2( 0.0f, 0.0f ); g_cvVertices[g_nVertexNum + 1].v4Pos = XMFLOAT4( x, y + pTexPic->nHeight, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v2UV = XMFLOAT2( 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Pos = XMFLOAT4( x + pTexPic->nWidth, y, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v2UV = XMFLOAT2( 1.0f, 0.0f ); g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1]; g_cvVertices[g_nVertexNum + 4].v4Pos = XMFLOAT4( x + pTexPic->nWidth, y + pTexPic->nHeight, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v2UV = XMFLOAT2( 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2]; g_nVertexNum += 6; g_pNowTexture = pTexPic->pSRViewTexture; return 0; }
// 3Dポリゴンの描画 int Draw3DPolygon( float x1, float y1, float z1, int nColor1, float x2, float y2, float z2, int nColor2, float x3, float y3, float z3, int nColor3 ) { if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 3 ) ) return -1; // 頂点がバッファからあふれる場合は描画せず // テクスチャがあれば待ち行列フラッシュ if ( g_pNowTexture ) { FlushDrawingPictures(); } // 頂点セット g_cvVertices[g_nVertexNum + 0].v4Pos = XMFLOAT4( x1, y1, z1, 1.0f ); g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( ( float )( ( nColor1 >> 16 ) & 0xff ) / 255.0f, ( float )( ( nColor1 >> 8 ) & 0xff ) / 255.0f, ( float )( ( nColor1 ) & 0xff ) / 255.0f, ( float )( ( nColor1 >> 24 ) & 0xff ) / 255.0f ); g_cvVertices[g_nVertexNum + 1].v4Pos = XMFLOAT4( x2, y2, z2, 1.0f ); g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( ( float )( ( nColor2 >> 16 ) & 0xff ) / 255.0f, ( float )( ( nColor2 >> 8 ) & 0xff ) / 255.0f, ( float )( ( nColor2 ) & 0xff ) / 255.0f, ( float )( ( nColor2 >> 24 ) & 0xff ) / 255.0f ); g_cvVertices[g_nVertexNum + 2].v4Pos = XMFLOAT4( x3, y3, z3, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( ( float )( ( nColor3 >> 16 ) & 0xff ) / 255.0f, ( float )( ( nColor3 >> 8 ) & 0xff ) / 255.0f, ( float )( ( nColor3 ) & 0xff ) / 255.0f, ( float )( ( nColor3 >> 24 ) & 0xff ) / 255.0f ); g_nVertexNum += 3; g_pNowTexture = NULL; return 0; }
int DrawChangingPictures( void ) // 毎フレーム呼ばれる { int i; float xt[4], yt[4]; // 上側直線上の点 float xb[4], yb[4]; // 下側直線上の点 fBoundary_t += fBoundary_v; // 境界線を動かす if ( fBoundary_t < -VIEW_WIDTH / 2.0f - GRAD_WIDTH ) { // 画面左端 fBoundary_t = -VIEW_WIDTH / 2.0f - GRAD_WIDTH; fBoundary_v = -fBoundary_v; } if ( fBoundary_t > VIEW_HEIGHT / 2.0f ) { // 画面右端 fBoundary_t = VIEW_HEIGHT / 2.0; fBoundary_v = -fBoundary_v; } xt[0] = VIEW_WIDTH - VIEW_WIDTH / 2.0f - GRAD_WIDTH; yt[0] = 0.0f - VIEW_WIDTH / 2.0f - GRAD_WIDTH; xt[1] = VIEW_WIDTH + fBoundary_t; yt[1] = 0.0f + fBoundary_t; xt[2] = VIEW_WIDTH + fBoundary_t + GRAD_WIDTH; yt[2] = 0.0f + fBoundary_t + GRAD_WIDTH; xt[3] = VIEW_WIDTH + VIEW_HEIGHT / 2.0f + GRAD_WIDTH; yt[3] = 0.0f + VIEW_HEIGHT / 2.0f + GRAD_WIDTH; for ( i = 0; i < 4; i++ ) { xb[i] = xt[i] - ( VIEW_WIDTH + VIEW_HEIGHT ); yb[i] = yt[i] + ( VIEW_WIDTH + VIEW_HEIGHT ); } g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); Draw2DPolygon( xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, xb[0], yb[0], xb[0] / VIEW_WIDTH, yb[0] / VIEW_HEIGHT, xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, &g_tPic2 ); Draw2DPolygon( xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, xb[0], yb[0], xb[0] / VIEW_WIDTH, yb[0] / VIEW_HEIGHT, xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT, &g_tPic2 ); Draw2DPolygon( xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT, xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, &g_tPic1 ); Draw2DPolygon( xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT, xb[3], yb[3], xb[3] / VIEW_WIDTH, yb[3] / VIEW_HEIGHT, &g_tPic1 ); FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF ); Draw2DPolygonWithColor( xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT, 0x00ffffff, xb[1], yb[1], xb[1] / VIEW_WIDTH, yb[1] / VIEW_HEIGHT, 0x00ffffff, xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0xffffffff, &g_tPic1 ); Draw2DPolygonWithColor( xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0xffffffff, xb[1], yb[1], xb[1] / VIEW_WIDTH, yb[1] / VIEW_HEIGHT, 0x00ffffff, xb[2], yb[2], xb[2] / VIEW_WIDTH, yb[2] / VIEW_HEIGHT, 0xffffffff, &g_tPic1 ); return 0; }
// 렌더링 HRESULT Render( void ) { int i; // 화면 클리어 XMFLOAT4 v4Color = XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f ); g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color ); // 샘플러 래스터라이저 세트 g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState ); g_pImmediateContext->RSSetState( g_pRS ); // 그리기 설정 UINT nStrides = sizeof( CUSTOMVERTEX ); UINT nOffsets = 0; g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets ); g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); g_pImmediateContext->IASetInputLayout( g_pInputLayout ); // 셰이더 설정 g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges ); g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); // 그리기 g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); DrawPicture( 0.0f, 0.0f, &g_tBack ); FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF ); DrawPicture( 0.0f, 240.0f - 32.0f, &g_tPlayer ); FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( g_pbsAddBlend, NULL, 0xFFFFFFFF ); for ( i = 0; i < DIVIDE_NUM * 4; i += 4 ) { DrawQuadranglePic( v2Pos[i].x, v2Pos[i].y, v2Pos[i + 1].x, v2Pos[i + 1].y, v2Pos[i + 2].x, v2Pos[i + 2].y, v2Pos[i + 3].x, v2Pos[i + 3].y, &g_tRay ); } // 표시 FlushDrawingPictures(); return S_OK; }
// レンダリング HRESULT Render( void ) { // 画面クリア XMFLOAT4 v4Color = XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f ); g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color ); // *** Zバッファクリア *** g_pImmediateContext->ClearDepthStencilView( g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 ); // サンプラ・ラスタライザセット g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState ); g_pImmediateContext->RSSetState( g_pRS ); // 描画設定 UINT nStrides = sizeof( CUSTOMVERTEX ); UINT nOffsets = 0; g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets ); g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); g_pImmediateContext->IASetInputLayout( g_pInputLayout ); // シェーダ設定 g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges ); g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); // 変換行列 CBNeverChanges cbNeverChanges; XMMATRIX mWorld; XMMATRIX mView; XMMATRIX mProjection; mWorld = CreateWorldMatrix(); // Initialize the view matrix XMVECTOR Eye = XMVectorSet( 0.0f, 3.0f, -5.0f, 0.0f ); XMVECTOR At = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f ); XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f ); mView = XMMatrixLookAtLH( Eye, At, Up ); // Initialize the projection matrix mProjection = XMMatrixPerspectiveFovLH( XM_PIDIV4, VIEW_WIDTH / ( FLOAT )VIEW_HEIGHT, 0.01f, 100.0f ); cbNeverChanges.mView = XMMatrixTranspose( mWorld * mView * mProjection ); g_pImmediateContext->UpdateSubresource( g_pCBNeverChanges, 0, NULL, &cbNeverChanges, 0, 0 ); // 描画 g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); DrawChangingPictures(); // 表示 FlushDrawingPictures(); return S_OK; }
// // スキャンラインアルゴリズムによるレンダリング int RenderScanLine( void ) { int x, y; float dx, dy, dz; // 画面中心を基準とした座標 float dzsq; // zの2乗 int nBright; float nx, ny, nz; // 球面上の法線ベクトル float lx = -1.0f / 1.732f; // 光源の方向ベクトル float ly = -1.0f / 1.732f; float lz = 1.0f / 1.732f; float fAmbient = 128.0f; // アンビエント光 float fDirect = 128.0f; // ディレクショナル光 float fDot; // 内積 float fAngle; // xz平面上での角度 for ( y = 0; y < VIEW_HEIGHT; y++ ) { // y方向ループ for ( x = 0; x < VIEW_WIDTH; x++ ) { // x方向ループ dx = x - VIEW_WIDTH / 2.0f; // 相対x座標 dy = y - VIEW_HEIGHT / 2.0f; // 相対y座標 dzsq = RAD * RAD - dx * dx - dy * dy; // zの2乗計算 if ( dzsq > 0.0f ) { dz = sqrtf( dzsq ); fAngle = atan2f( dz, dx ); // xz平面上での角度 if ( fAngle < 0.0f ) fAngle += 2.0f * PI; // プラスの角度に nx = dx / RAD; ny = dy / RAD; nz = dz / RAD; // 法線ベクトル fDot = nx * lx + ny * ly + nz * lz; // 内積 if ( fDot >= 0.0f ) { // 光源からの光が当たる nBright = ( int )( fDot * fDirect + fAmbient ); } else { // 光源からの光が当たらない nBright = ( int )fAmbient; } if ( ( int )( fAngle / ( 2.0f * PI ) * 16 ) & 1 ) { DrawPoints( x, y, nBright, nBright, nBright ); // 白 } else { DrawPoints( x, y, nBright, 0, nBright ); // マゼンタ } } } FlushDrawingPictures(); } return 0; }
// レンダリング HRESULT Render( void ) { int i; // 画面クリア XMFLOAT4 v4Color = XMFLOAT4( 0.0f, 0.0f, 1.0f, 1.0f ); g_pImmediateContext->ClearRenderTargetView( g_pRTV, ( float * )&v4Color ); // サンプラ・ラスタライザセット g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerState ); g_pImmediateContext->RSSetState( g_pRS ); // 描画設定 UINT nStrides = sizeof( CUSTOMVERTEX ); UINT nOffsets = 0; g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pD3D11VertexBuffer, &nStrides, &nOffsets ); g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); g_pImmediateContext->IASetInputLayout( g_pInputLayout ); // シェーダ設定 g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pCBNeverChanges ); g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); // 描画 g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); // DrawPicture( fBack_x, 0.0f, &g_tBack ); for ( i = 0; i < VIEW_HEIGHT; i++ ) { DrawPicturePart( v2Points[i].x, v2Points[i].y, v2Points[i].x + PIC_WIDTH_DOWN, v2Points[i].y + 1.0f, 0.0f, v2Points[i].y, &g_tBack ); } g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF ); // 表示 FlushDrawingPictures(); return S_OK; }
// 絵の一部分描画 int DrawPicturePart( float x1, float y1, float x2, float y2, float px, float py, TEX_PICTURE *pTexPic ) { float u1, v1, u2, v2; if ( g_nVertexNum > ( MAX_BUFFER_VERTEX - 6 ) ) return -1; // 頂点がバッファからあふれる場合は描画せず // テクスチャが切り替えられていれば待ち行列フラッシュ if ( ( pTexPic->pSRViewTexture != g_pNowTexture ) && g_pNowTexture ) { FlushDrawingPictures(); } u1 = px / pTexPic->nWidth; v1 = py / pTexPic->nHeight; u2 = u1 + ( x2 - x1 ) / pTexPic->nWidth; v2 = v1 + ( y2 - y1 ) / pTexPic->nHeight; // 頂点セット g_cvVertices[g_nVertexNum + 0].v4Pos = XMFLOAT4( x1, y1, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 0].v2UV = XMFLOAT2( u1, v1 ); g_cvVertices[g_nVertexNum + 1].v4Pos = XMFLOAT4( x1, y2, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 1].v2UV = XMFLOAT2( u1, v2 ); g_cvVertices[g_nVertexNum + 2].v4Pos = XMFLOAT4( x2, y1, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 2].v2UV = XMFLOAT2( u2, v1 ); g_cvVertices[g_nVertexNum + 3] = g_cvVertices[g_nVertexNum + 1]; g_cvVertices[g_nVertexNum + 4].v4Pos = XMFLOAT4( x2, y2, 0.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v4Color = XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ); g_cvVertices[g_nVertexNum + 4].v2UV = XMFLOAT2( u2, v2 ); g_cvVertices[g_nVertexNum + 5] = g_cvVertices[g_nVertexNum + 2]; g_nVertexNum += 6; g_pNowTexture = pTexPic->pSRViewTexture; return 0; }
int DrawChangingPictures( void ) // 毎フレーム呼ばれる { int i; float fAngle1, fAngle2; float fAngleDelta; float xt[6], yt[6]; // 上側直線上の点 int nCenterColor; fBoundary_r1 += fBoundary_v; // 境界線を動かす if ( fBoundary_r1 < -GRAD_WIDTH + MIN_R ) { // 最小円 fBoundary_r1 = -GRAD_WIDTH + MIN_R; fBoundary_v = -fBoundary_v; } if ( fBoundary_r1 > fBoundary_r3 ) { // 最大円 fBoundary_r1 = fBoundary_r3; fBoundary_v = -fBoundary_v; } fBoundary_r2 = fBoundary_r1 + GRAD_WIDTH; fAngleDelta = 2.0f * PI / DIVIDE_NUM; fAngle1 = 0.0f; fAngle2 = fAngleDelta; if ( fBoundary_r1 > 1.0f ) { for ( i = 0; i < DIVIDE_NUM; i++ ) { xt[0] = VIEW_WIDTH / 2.0f + fBoundary_r1 * cosf( fAngle1 ); yt[0] = VIEW_HEIGHT / 2.0f + fBoundary_r1 * sinf( fAngle1 ); xt[1] = VIEW_WIDTH / 2.0f + fBoundary_r1 * cosf( fAngle2 ); yt[1] = VIEW_HEIGHT / 2.0f + fBoundary_r1 * sinf( fAngle2 ); xt[2] = VIEW_WIDTH / 2.0f + fBoundary_r2 * cosf( fAngle1 ); yt[2] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle1 ); xt[3] = VIEW_WIDTH / 2.0f + fBoundary_r2 * cosf( fAngle2 ); yt[3] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle2 ); xt[4] = VIEW_WIDTH / 2.0f + fBoundary_r3 * cosf( fAngle1 ); yt[4] = VIEW_HEIGHT / 2.0f + fBoundary_r3 * sinf( fAngle1 ); xt[5] = VIEW_WIDTH / 2.0f + fBoundary_r3 * cosf( fAngle2 ); yt[5] = VIEW_HEIGHT / 2.0f + fBoundary_r3 * sinf( fAngle2 ); FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); Draw2DPolygon( VIEW_WIDTH / 2.0f, VIEW_HEIGHT / 2.0f, 0.5f, 0.5f, xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT, xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, &g_tPic1 ); Draw2DPolygon( xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, xt[5], yt[5], xt[5] / VIEW_WIDTH, yt[5] / VIEW_HEIGHT, xt[4], yt[4], xt[4] / VIEW_WIDTH, yt[4] / VIEW_HEIGHT, &g_tPic2 ); Draw2DPolygon( xt[5], yt[5], xt[5] / VIEW_WIDTH, yt[5] / VIEW_HEIGHT, xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT, &g_tPic2 ); FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF ); Draw2DPolygonWithColor( xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, 0xffffffff, xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, 0x00ffffff, xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0x00ffffff, &g_tPic1 ); Draw2DPolygonWithColor( xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, 0x00ffffff, xt[0], yt[0], xt[0] / VIEW_WIDTH, yt[0] / VIEW_HEIGHT, 0xffffffff, xt[1], yt[1], xt[1] / VIEW_WIDTH, yt[1] / VIEW_HEIGHT, 0xffffffff, &g_tPic1 ); fAngle1 += fAngleDelta; fAngle2 += fAngleDelta; } } else { FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( NULL, NULL, 0xFFFFFFFF ); DrawPicture( 0.0f, 0.0f, &g_tPic2 ); for ( i = 0; i < DIVIDE_NUM; i++ ) { xt[2] = VIEW_WIDTH / 2.0f + fBoundary_r2 * cosf( fAngle1 ); yt[2] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle1 ); xt[3] = VIEW_WIDTH / 2.0f + fBoundary_r2 * cosf( fAngle2 ); yt[3] = VIEW_HEIGHT / 2.0f + fBoundary_r2 * sinf( fAngle2 ); FlushDrawingPictures(); g_pImmediateContext->OMSetBlendState( g_pbsAlphaBlend, NULL, 0xFFFFFFFF ); nCenterColor = ( ( int )( fBoundary_r2 * 255 / GRAD_WIDTH ) << 24 ) + 0xffffff; Draw2DPolygonWithColor( VIEW_WIDTH / 2.0f, VIEW_HEIGHT / 2.0f, 0.5f, 0.5f, nCenterColor, xt[3], yt[3], xt[3] / VIEW_WIDTH, yt[3] / VIEW_HEIGHT, 0x00ffffff, xt[2], yt[2], xt[2] / VIEW_WIDTH, yt[2] / VIEW_HEIGHT, 0x00ffffff, &g_tPic1 ); fAngle1 += fAngleDelta; fAngle2 += fAngleDelta; } } return 0; }