`

简单纹理绘制

 
阅读更多

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

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

 

 

分享到:
评论

相关推荐

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

    在真实感图形绘制中,纹理处理是一个关键环节,它能够为二维图形增添丰富的细节,使其看起来更加立体、生动。 纹理处理主要包括纹理映射、纹理过滤、纹理合成等技术。纹理映射是将图像(纹理)应用到三维模型表面的...

    绘制用纹理填充的图形

    在计算机图形学中,"绘制用纹理填充的图形"是一个重要的技术,特别是在游戏开发、图像处理和用户界面设计中广泛使用。纹理填充是通过将一个图像(纹理)映射到二维图形表面,来给图形增添细节和真实感的过程。本文将...

    matlab纹理柱状图绘制程序applyhatch

    这些纹理可以是简单的线条、斜纹、网格等,也可以是更复杂的图像,使得每个柱子具有独特的外观,从而帮助区分不同的数据组。 applyhatch.m可能是主函数,负责调用和设置柱状图的基本属性,如柱子的颜色、宽度、高度...

    c语言中使用opengl 贴纹理

    在`8textureex1`这个示例中,可能包含了一个简单的纹理应用实例,例如一个立方体或其他几何形状,展示了如何加载和应用纹理。可能还包括了加载图像库(如SOIL或FreeImage)来简化图像数据的读取和处理。 总结来说,...

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

    4. **纹理应用**:在绘制立方体时,通过`glEnable(GL_TEXTURE_2D)`开启纹理映射,然后在每个面的顶点数据中包含纹理坐标。在绘制每条边时,使用`glTexCoord2f`指定纹理坐标,`glVertex3f`指定几何顶点。 5. **绘制...

    安卓ndk实现opengl绘制正方形纹理

    为了使纹理正确显示,你需要编写一个简单的OpenGL着色器程序。着色器是用GLSL(OpenGL Shading Language)编写的,分为顶点着色器和片段着色器。顶点着色器处理顶点坐标,片段着色器处理像素颜色,包括纹理采样。 ...

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

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

    directX9纹理贴图简单示例

    在这个“DirectX9纹理贴图简单示例”中,我们将探讨如何在Visual C++ 6.0(VC6Pro)环境下利用DirectX9 API实现纹理贴图的技术。 纹理贴图是3D图形渲染中的核心概念,它为几何对象表面添加了细节和色彩,使场景更加...

    立方体函数纹理映射算法

    5. **绘制和渲染**:最后,更新图形上下文,绘制立方体并将其呈现在屏幕上。这涉及到设置投影和视图矩阵,以及处理光照和其他视觉效果。 这个例子中的代码可能还包含了用户交互部分,允许调整函数纹理参数或旋转...

    简单的D3D9纹理共享

    5. 应用纹理:在绘制3D模型时,我们使用`IDirect3DDevice9::SetTexture`函数将纹理绑定到特定的纹理阶段,然后使用相应的纹理坐标进行渲染。 现在,让我们转向纹理共享。在D3D9中,不同设备之间共享纹理可以提高...

    opengl四面体纹理映射

    通过glBindTexture函数绑定纹理,glTexImage2D函数载入纹理数据,然后在绘制几何体时使用glTexCoordPointer和glVertexPointer指定纹理坐标和顶点坐标。 为了实现四面体的旋转,我们可以利用OpenGL的模型视图矩阵,...

    opengl绘制树

    在OpenGL中绘制树是一项复杂的任务,它涉及到几何建模、纹理映射、光照处理等多个方面。以下是一些关于使用OpenGL绘制树的关键知识点: 1. **几何建模**:在OpenGL中,树的形状通常通过多边形来表示。这可能包括...

    java 纹理填充特效源码

    在Java中,`java.awt.Graphics2D`类提供了强大的功能,可以实现各种复杂的纹理填充效果,包括但不限于简单的平铺、旋转、缩放、透明度控制等。此外,还可以结合Java的多线程和动画框架,创建动态的纹理填充特效,如...

    OpenGL中纹理应用

    5. 绘制:最后,使用glDrawArrays或glDrawElements绘制3D模型,OpenGL会自动完成纹理映射。 在实际应用中,我们可能会遇到多纹理、纹理混合、MIP贴图等更高级的技术。多纹理允许同时应用多个纹理,通过混合颜色来...

    OpenGL纹理贴图简单例子.zip_OPENGL 纹理_opengl纹理贴图_opengl贴图_纹理贴图_贴图

    5. **纹理绑定**:在绘制模型之前,你需要将纹理对象绑定到当前的纹理单元。你可以通过`glActiveTexture`选择纹理单元,然后使用`glBindTexture`将纹理对象绑定到目标。 6. **纹理坐标着色**:在顶点着色器中,你...

    opengl纹理贴图映射代码大全

    2. **纹理对象创建**:在OpenGL中,纹理不是一个简单的数据结构,而是通过`glGenTextures()`函数创建的纹理对象。这个对象随后会被绑定到特定的纹理单元,用`glBindTexture()`函数完成。 3. **纹理参数设置**:纹理...

    纹理动画代码案例

    **纹理位图切换** 是一种简单的纹理动画方式,通过在短时间内快速切换一系列相关的位图来创建连续的动画效果。比如,一个行走的人物,可以通过绘制多帧不同姿态的图像,然后按照一定的顺序和速度切换这些图像,使得...

    opengl简单地形绘制

    本项目“opengl简单地形绘制”是基于VC++(Microsoft Visual C++)平台,利用OpenGL库来实现对地形的渲染。在这个项目中,开发者使用了三角形带这一图形构造元素来构建地形模型,并且添加了材质和光照效果,使得地形...

    directx绘制流水线&绘制简单图形

    DirectX 绘制流水线 & 绘制简单图形 DirectX 是一种由 Microsoft 公司开发的多媒体编程接口,主要用于游戏、图形和音频处理。DirectX 绘制流水线是指从 3D 模型到屏幕显示的整个过程。下面我们将详细介绍 DirectX ...

Global site tag (gtag.js) - Google Analytics