`

简单纹理绘制

 
阅读更多

在延迟渲染里面,会把结果绘制到纹理里面,然后再把纹理绘制到一个四顶点的平面上。所以,这里把一个比较简单的纹理绘制贴出来,以供以后方便使用。

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;
}

 

 

分享到:
评论

相关推荐

    真实感图形绘制-纹理处理

    真实感图形绘制-纹理处理,绘制真实图形的纹理,代码清晰,可以更换图片

    Android移动开发-使用OpenGL来绘制3D纹理图的实现

    在3D绘制中进行的纹理贴图也很简单,与设置顶点颜色的步骤相似,只要三步,步骤如下: Step1:设置启用贴图坐标数组; Step2:设置贴图坐标的数组信息; Step3:调用GL10的glBindTexture(int target, int texture...

    如何使用GDI+绘制简单的图像

    • SolidBrush:画刷最简单的形式,用纯色进行绘制 • HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色 • TextureBrush:使用纹理(如图像)进行绘制 •...

    OpenGL简单实例——实现立方体贴上不同纹理

    简单的OpenGL实例,基于GLUT库c语言实现,画出一个立方体,在六个面贴上纹理,初学者可以看看

    基于深度纹理的复杂透明对象稳定绘制类

    在OSG下开发的一个派生自geode的类的源代码,设计了一项基于深度纹理的技术,支持透明物体的稳定绘制,即相当于进行了自定义的消隐,只绘制最前面的片元,避免了显示的混乱甚至出现绘制错误感的情况。类使用简单,...

    Android OpenGL ES 绘制简易地球

    Android端使用OpenGL ES 绘制简易的地球,超简易,只是添加顶点和纹理数据给glsl绘制,没经过任何其他的加工,仅适合初学者查看流程。

    关于OpenGL的纹理贴图整合解析

    简单地说,纹理就是矩形的数据数组,例如颜色数据、亮度数据、颜色和alpha数据。纹理数组中的单个值常称为纹理单元(texel),纹理贴图之所以复杂的原因是矩形的纹理可以映射到非矩形的区域,并且必须以合理的方式实现...

    Android OpenGL绘制STL 3D模型

    3D指南针效果 利用OpenGL绘制简单stl格式(未带纹理)的3D模型

    基于osg的模型绘制

    基于osg开发环境绘制的简单房屋模型,并贴上纹理和材质,使房屋更有立体感,有助于osg及vc++的学习.

    openglexercise01_opengl_基础openGL图形坐标变换、纹理映射_

    简单的opengl窗口,绘制了一个矩形并增添了纹理和坐标变换的操作选择。

    opengl纹理贴图例子

    基于opengl写的一个小例程,绘制四面体,并且对其贴图......程序比较简单,适合入门

    VC++结合opengl绘制太阳系

    在VC中结合最新版本的opengl绘制太阳系运动,运用了纹理,光照,背景,运动控制,还原真实的太阳系,层次简单易学,对于初学者有一定的帮助,注释详细。

    openGL实现天空盒,使用OpenGL 立方体贴图

    在上一节中看到的简单方法稍微复杂一点。但是,使用OpenGL 立方体贴图有自己的优点, 例如减少接缝以及支持环境贴图。 2.OpenGL 纹理立方体贴图类似于稍后将要研究的3D 纹理,它们都使用3 个纹理坐标访 问——通常...

    Paint in 3D V1.9.2

    稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 ?自动保存和加载 - Paint in 3D 带有一个简易使用的系统,...

    SubstancePainter(游戏贴图绘制软件)v2.0.3汉化特别版(破解补丁中文包)X64

    内置全新的3D贴图绘制程序和特色的粒子绘制工具,可通过粒子来模拟自然界中沙尘、磨损、水痕等效果,也可在物件上实现撒水、丢土以及火烧等逼真效果,让3D模型的纹理的创建变得十分简单和方便。需要的朋友们可以下载...

    头文件-lodepng.h

    博客《openGL绘制正方体分别实现简单颜色绘制、纹理绘制、光照绘制》所需的头文件。

    Paint in 3D v1.11.5

    稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 自动保存和加载 - Paint in 3D 带有一个简易使用的系统,可...

    vrml简单房间

    BOX绘制一个简单的大客厅,在客厅中某个位置用Transform等节点绘制一个螺旋上升的台阶,并用ImageTexture和PixelTexture分别为其设置纹理。台阶形状如下图所示,不要求绘制护栏。然后用box在客厅内适当位置制作一张...

    glo_纹理和光照模型_计算机图形学_bezier曲面OpenGL_bezier曲面光照_

    Bezier曲面的创建并实现简单的纹理和光照模型

Global site tag (gtag.js) - Google Analytics