在延迟渲染里面,会把结果绘制到纹理里面,然后再把纹理绘制到一个四顶点的平面上。所以,这里把一个比较简单的纹理绘制贴出来,以供以后方便使用。
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; }
相关推荐
真实感图形绘制-纹理处理,绘制真实图形的纹理,代码清晰,可以更换图片
在3D绘制中进行的纹理贴图也很简单,与设置顶点颜色的步骤相似,只要三步,步骤如下: Step1:设置启用贴图坐标数组; Step2:设置贴图坐标的数组信息; Step3:调用GL10的glBindTexture(int target, int texture...
• SolidBrush:画刷最简单的形式,用纯色进行绘制 • HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色 • TextureBrush:使用纹理(如图像)进行绘制 •...
简单的OpenGL实例,基于GLUT库c语言实现,画出一个立方体,在六个面贴上纹理,初学者可以看看
在OSG下开发的一个派生自geode的类的源代码,设计了一项基于深度纹理的技术,支持透明物体的稳定绘制,即相当于进行了自定义的消隐,只绘制最前面的片元,避免了显示的混乱甚至出现绘制错误感的情况。类使用简单,...
Android端使用OpenGL ES 绘制简易的地球,超简易,只是添加顶点和纹理数据给glsl绘制,没经过任何其他的加工,仅适合初学者查看流程。
简单地说,纹理就是矩形的数据数组,例如颜色数据、亮度数据、颜色和alpha数据。纹理数组中的单个值常称为纹理单元(texel),纹理贴图之所以复杂的原因是矩形的纹理可以映射到非矩形的区域,并且必须以合理的方式实现...
3D指南针效果 利用OpenGL绘制简单stl格式(未带纹理)的3D模型
基于osg开发环境绘制的简单房屋模型,并贴上纹理和材质,使房屋更有立体感,有助于osg及vc++的学习.
简单的opengl窗口,绘制了一个矩形并增添了纹理和坐标变换的操作选择。
基于opengl写的一个小例程,绘制四面体,并且对其贴图......程序比较简单,适合入门
在VC中结合最新版本的opengl绘制太阳系运动,运用了纹理,光照,背景,运动控制,还原真实的太阳系,层次简单易学,对于初学者有一定的帮助,注释详细。
在上一节中看到的简单方法稍微复杂一点。但是,使用OpenGL 立方体贴图有自己的优点, 例如减少接缝以及支持环境贴图。 2.OpenGL 纹理立方体贴图类似于稍后将要研究的3D 纹理,它们都使用3 个纹理坐标访 问——通常...
稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 ?自动保存和加载 - Paint in 3D 带有一个简易使用的系统,...
内置全新的3D贴图绘制程序和特色的粒子绘制工具,可通过粒子来模拟自然界中沙尘、磨损、水痕等效果,也可在物件上实现撒水、丢土以及火烧等逼真效果,让3D模型的纹理的创建变得十分简单和方便。需要的朋友们可以下载...
博客《openGL绘制正方体分别实现简单颜色绘制、纹理绘制、光照绘制》所需的头文件。
稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 自动保存和加载 - Paint in 3D 带有一个简易使用的系统,可...
BOX绘制一个简单的大客厅,在客厅中某个位置用Transform等节点绘制一个螺旋上升的台阶,并用ImageTexture和PixelTexture分别为其设置纹理。台阶形状如下图所示,不要求绘制护栏。然后用box在客厅内适当位置制作一张...
Bezier曲面的创建并实现简单的纹理和光照模型