在延迟渲染里面,会把结果绘制到纹理里面,然后再把纹理绘制到一个四顶点的平面上。所以,这里把一个比较简单的纹理绘制贴出来,以供以后方便使用。
PWProcess:
#include "StdAfx.h" #include "PWProcess.h" PWProcess::PWProcess(void) :mVertexCount(0), mIndexCount(0), mVertexShader(0) ,mPixelShader(0) ,mInputLayout(0) { } PWProcess::~PWProcess(void) { } void PWProcess::init(ID3D11Device* device) { VertexBuffer* vertices; unsigned long* indices; D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc; D3D11_SUBRESOURCE_DATA vertexData, indexData; HRESULT result; mVertexCount = 4; mIndexCount = 6; // 创建顶点临时缓冲. vertices = new VertexBuffer[mVertexCount]; // 创建索引缓冲. indices = new unsigned long[mIndexCount]; vertices[0].position = Vector3(-1.0f, 1.0f, 0.5f); //1 顺时针 vertices[1].position = Vector3(1.0f, 1.0f, 0.5f); // 2 vertices[2].position = Vector3(-1.0f, -1.0f, 0.5f); // 3 vertices[3].position = Vector3(1.0f, -1.0f, 0.5f); // 4 vertices[0].texture = Vector2(0.0f, 0.0f); // 012 021 102 120 201 210 vertices[1].texture = Vector2(1.0f, 0.0f); vertices[2].texture = Vector2(0.0f, 1.0f); vertices[3].texture = Vector2(1.0f, 1.0f); /*float2(-1, +1), float2(+1, +1), float2(-1, -1), float2(+1, -1)*/ // 顺时针方向的三角形 indices[0] = 0; indices[1] = 1; indices[2] = 2; indices[3] = 2; indices[4] = 1; indices[5] = 3; // 设置顶点缓冲描述 vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT; vertexBufferDesc.ByteWidth = sizeof(VertexBuffer) * mVertexCount; vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; vertexBufferDesc.CPUAccessFlags = 0; vertexBufferDesc.MiscFlags = 0; vertexBufferDesc.StructureByteStride = 0; // 指向保存顶点数据的临时缓冲. vertexData.pSysMem = vertices; vertexData.SysMemPitch = 0; vertexData.SysMemSlicePitch = 0; // 创建顶点缓冲. result = device->CreateBuffer(&vertexBufferDesc, &vertexData, &mVertexBuffer); // 设置索引缓冲描述. indexBufferDesc.Usage = D3D11_USAGE_DEFAULT; indexBufferDesc.ByteWidth = sizeof(unsigned long) * mIndexCount; indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; indexBufferDesc.MiscFlags = 0; indexBufferDesc.StructureByteStride = 0; // 指向存临时索引缓冲. indexData.pSysMem = indices; indexData.SysMemPitch = 0; indexData.SysMemSlicePitch = 0; // 创建索引缓冲. result = device->CreateBuffer(&indexBufferDesc, &indexData, &mIndexBuffer); // 释放临时缓冲. delete [] vertices; vertices = 0; delete [] indices; indices = 0; ID3D10Blob* errorMessage; ID3D10Blob* vertexShaderBuffer; ID3D10Blob* pixelShaderBuffer; // 初始化指针为空. errorMessage = 0; vertexShaderBuffer = 0; pixelShaderBuffer = 0; // 编译vs代码. D3DX11CompileFromFile(L"shader\\Texture.hlsl", NULL, NULL, "PortVertexShader", "vs_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &vertexShaderBuffer, &errorMessage, NULL); // 编译ps. D3DX11CompileFromFile(L"shader\\Texture.hlsl", NULL, NULL, "PortPixelShader", "ps_5_0", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pixelShaderBuffer, &errorMessage, NULL); // 从缓冲创建vs shader. device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &mVertexShader); // 从缓冲创建ps shader. device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &mPixelShader); // 设置数据布局,以便在shader中使用. createInputLayout(device,vertexShaderBuffer); //释放顶点和像素缓冲. vertexShaderBuffer->Release(); vertexShaderBuffer = 0; pixelShaderBuffer->Release(); pixelShaderBuffer = 0; } void PWProcess::createInputLayout(ID3D11Device* device,ID3D10Blob* vertexShaderBuffer) { unsigned int numElements; D3D11_INPUT_ELEMENT_DESC polygonLayout[] = { {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_VERTEX_DATA,0}, {"NORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_VERTEX_DATA,0}, {"TANGENT",0,DXGI_FORMAT_R32G32B32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_VERTEX_DATA,0}, {"BINORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_VERTEX_DATA,0}, {"TEXCOORD",0,DXGI_FORMAT_R32G32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_VERTEX_DATA,0} }; // 得到layout中的元素数量 numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]); // 创建顶点输入布局. device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &mInputLayout); } void PWProcess::release() { // 释放顶点缓冲. if(mIndexBuffer) { mIndexBuffer->Release(); mIndexBuffer = 0; } // 释放索引缓冲 if(mVertexBuffer) { mVertexBuffer->Release(); mVertexBuffer = 0; } //释放顶点布局t. if(mInputLayout) { mInputLayout->Release(); mInputLayout = 0; } // 释放ps . if(mPixelShader) { mPixelShader->Release(); mPixelShader = 0; } // 释放vs if(mVertexShader) { mVertexShader->Release(); mVertexShader = 0; } } void PWProcess::render(ID3D11DeviceContext* immediateContext) { unsigned int stride = sizeof(VertexBuffer); unsigned int offset = 0; immediateContext->IASetVertexBuffers(0, 1, &mVertexBuffer, &stride, &offset); // f58c //在input assemberl阶段绑定索引缓冲,以便能够被渲染 immediateContext->IASetIndexBuffer(mIndexBuffer, DXGI_FORMAT_R32_UINT, 0); // f88c // 设置体元语义,渲染线段,画出坐标轴 immediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // 绑定顶点布局. immediateContext->IASetInputLayout(mInputLayout); // 设置渲染使用vs和ps. immediateContext->VSSetShader(mVertexShader, NULL, 0); immediateContext->PSSetShader(mPixelShader, NULL, 0); // 渲染三角形 immediateContext->DrawIndexed(mIndexCount, 0, 0); }
Texture.hlsl :
Texture2D mTexture; SamplerState mSampleType; cbuffer MatrixBuffer { matrix world; matrix transform; }; struct VertexInputType { float4 viPosition : POSITION; float2 viTexture : TEXCOORD; //纹理坐标 }; struct PixelInputType { float4 piPosition : SV_POSITION; float2 piTexture : TEXCOORD0; //纹理坐标 }; //////////////////////////////////////////////////////////////////////////////// // Vertex Shader //////////////////////////////////////////////////////////////////////////////// PixelInputType PortVertexShader(VertexInputType input) { PixelInputType output; // 改变顶点为四个分量其次坐标. input.viPosition.w = 1.0f; output.piPosition = input.viPosition; //output.piPosition = mul(output.piPosition, transform); output.piTexture= input.viTexture; // 纹理坐标 return output; } //////////////////////////////////////////////////////////////////////////////// // Pixel Shader //////////////////////////////////////////////////////////////////////////////// float4 PortPixelShader(PixelInputType input) : SV_TARGET { float4 color = mTexture.Sample(mSampleType, input.piTexture); return color; }
相关推荐
在真实感图形绘制中,纹理处理是一个关键环节,它能够为二维图形增添丰富的细节,使其看起来更加立体、生动。 纹理处理主要包括纹理映射、纹理过滤、纹理合成等技术。纹理映射是将图像(纹理)应用到三维模型表面的...
在计算机图形学中,"绘制用纹理填充的图形"是一个重要的技术,特别是在游戏开发、图像处理和用户界面设计中广泛使用。纹理填充是通过将一个图像(纹理)映射到二维图形表面,来给图形增添细节和真实感的过程。本文将...
这些纹理可以是简单的线条、斜纹、网格等,也可以是更复杂的图像,使得每个柱子具有独特的外观,从而帮助区分不同的数据组。 applyhatch.m可能是主函数,负责调用和设置柱状图的基本属性,如柱子的颜色、宽度、高度...
在`8textureex1`这个示例中,可能包含了一个简单的纹理应用实例,例如一个立方体或其他几何形状,展示了如何加载和应用纹理。可能还包括了加载图像库(如SOIL或FreeImage)来简化图像数据的读取和处理。 总结来说,...
4. **纹理应用**:在绘制立方体时,通过`glEnable(GL_TEXTURE_2D)`开启纹理映射,然后在每个面的顶点数据中包含纹理坐标。在绘制每条边时,使用`glTexCoord2f`指定纹理坐标,`glVertex3f`指定几何顶点。 5. **绘制...
为了使纹理正确显示,你需要编写一个简单的OpenGL着色器程序。着色器是用GLSL(OpenGL Shading Language)编写的,分为顶点着色器和片段着色器。顶点着色器处理顶点坐标,片段着色器处理像素颜色,包括纹理采样。 ...
在3D绘制中进行的纹理贴图也很简单,与设置顶点颜色的步骤相似,只要三步,步骤如下: Step1:设置启用贴图坐标数组; Step2:设置贴图坐标的数组信息; Step3:调用GL10的glBindTexture(int target, int texture...
在这个“DirectX9纹理贴图简单示例”中,我们将探讨如何在Visual C++ 6.0(VC6Pro)环境下利用DirectX9 API实现纹理贴图的技术。 纹理贴图是3D图形渲染中的核心概念,它为几何对象表面添加了细节和色彩,使场景更加...
5. **绘制和渲染**:最后,更新图形上下文,绘制立方体并将其呈现在屏幕上。这涉及到设置投影和视图矩阵,以及处理光照和其他视觉效果。 这个例子中的代码可能还包含了用户交互部分,允许调整函数纹理参数或旋转...
5. 应用纹理:在绘制3D模型时,我们使用`IDirect3DDevice9::SetTexture`函数将纹理绑定到特定的纹理阶段,然后使用相应的纹理坐标进行渲染。 现在,让我们转向纹理共享。在D3D9中,不同设备之间共享纹理可以提高...
通过glBindTexture函数绑定纹理,glTexImage2D函数载入纹理数据,然后在绘制几何体时使用glTexCoordPointer和glVertexPointer指定纹理坐标和顶点坐标。 为了实现四面体的旋转,我们可以利用OpenGL的模型视图矩阵,...
在OpenGL中绘制树是一项复杂的任务,它涉及到几何建模、纹理映射、光照处理等多个方面。以下是一些关于使用OpenGL绘制树的关键知识点: 1. **几何建模**:在OpenGL中,树的形状通常通过多边形来表示。这可能包括...
在Java中,`java.awt.Graphics2D`类提供了强大的功能,可以实现各种复杂的纹理填充效果,包括但不限于简单的平铺、旋转、缩放、透明度控制等。此外,还可以结合Java的多线程和动画框架,创建动态的纹理填充特效,如...
5. 绘制:最后,使用glDrawArrays或glDrawElements绘制3D模型,OpenGL会自动完成纹理映射。 在实际应用中,我们可能会遇到多纹理、纹理混合、MIP贴图等更高级的技术。多纹理允许同时应用多个纹理,通过混合颜色来...
5. **纹理绑定**:在绘制模型之前,你需要将纹理对象绑定到当前的纹理单元。你可以通过`glActiveTexture`选择纹理单元,然后使用`glBindTexture`将纹理对象绑定到目标。 6. **纹理坐标着色**:在顶点着色器中,你...
2. **纹理对象创建**:在OpenGL中,纹理不是一个简单的数据结构,而是通过`glGenTextures()`函数创建的纹理对象。这个对象随后会被绑定到特定的纹理单元,用`glBindTexture()`函数完成。 3. **纹理参数设置**:纹理...
**纹理位图切换** 是一种简单的纹理动画方式,通过在短时间内快速切换一系列相关的位图来创建连续的动画效果。比如,一个行走的人物,可以通过绘制多帧不同姿态的图像,然后按照一定的顺序和速度切换这些图像,使得...
本项目“opengl简单地形绘制”是基于VC++(Microsoft Visual C++)平台,利用OpenGL库来实现对地形的渲染。在这个项目中,开发者使用了三角形带这一图形构造元素来构建地形模型,并且添加了材质和光照效果,使得地形...
DirectX 绘制流水线 & 绘制简单图形 DirectX 是一种由 Microsoft 公司开发的多媒体编程接口,主要用于游戏、图形和音频处理。DirectX 绘制流水线是指从 3D 模型到屏幕显示的整个过程。下面我们将详细介绍 DirectX ...