Vertex Fetch Texture (VTF)

http://www.opengl.org/wiki/Vertex_Texture_Fetch

Vertex Texture Fetch

This article contains inaccurate information. Further details can be found on the talk page.

The following article discusses Vertex Texture Fetch feature of todays GPUs.

Vertex Texture Fetch will be referred to as VTF from now on.
Texture image units will be referred to as TIU.
VS means vertex shader
FS means fragment shader

What version of GL supports VTF?
In order to be able to do VTF, you need shader support. GLSL has been made core since GL 2.0.
You also need a GPU that supports VTF.
As of GL 2.1, texture float formats are not core yet. You need to check if GL_ARB_texture_float is present.
http://www.opengl.org/registry/specs/ARB/texture_float.txt
In GL 3.0, floating point formats became a core feature.

GPUs that support VTF use the same TIUs as the fragment shader. This means that you can bind a texture to TIU 1 and sample that same texture in the vertex shader and also the fragment shader. To bind the texture, it is rather simple :

 glActiveTexture(GL_TEXTURE1);
 glBindTexture(GL_TEXTURE_2D, textureID);

In order to know how many TIUs your vertex shader has access to, call

 int MaxVertexTextureImageUnits;
 glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &MaxVertexTextureImageUnits);
 int MaxCombinedTextureImageUnits;
 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &MaxCombinedTextureImageUnits);

and GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS is the TUI number accessible from your VS and FS combined.
If in your VS and FS, you access the same texture, that counts like accessing 2 TIUs.

An issue with accessing a texture is the texture format. Your GPU might support a wide range of formats that can be accessed by the TIU of the FS but the TIU of the VS simply doesn‘t support certain formats. For example, nVidia has published Vertex_Format.pdf when Gf6 was released
Gf 6 supports only GL_TEXTURE_2D of format GL_LUMINANCE32F_ARB and GL_RGBA32F_ARB. It doesn‘t support any of the other floating point formats or fixed point formats. There is no floating point compressed format.
All other formats besides GL_LUMINANCE32F_ARB and GL_RGBA32F_ARB cause the VS to run in software mode.
Gf 7 is similar to the Gf6.
Gf 8 is a DX10 level GPU and all DX10 level GPUs should support VTF with the same formats supported by the fragment pipe.

ATI/AMD :
ATI/AMD chose not to have VTF in their SM 3.0 GPUs.
X300 up to X1950. All of their standard X series.
They said it would be too slow. It would be better to do Render_To_VertexBuffer (R2VB).
In OpenGL, to do R2VB you would need PBO support. http://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt
PBO became core in GL 2.1 and ATI‘s driver do support GL 2.1.
ATI‘s DX10 parts, in other words all their GPUs with the HD in the name, support VTF.
ATI‘s driver does report 16 for GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS but users are saying that their shaders don‘t work.

Example code :

 uint vertex_texture;
 glGenTextures(1, &vertex_texture);
 glBindTexture(GL_TEXTURE_2D, vertex_texture);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 //Linear filter might cause a fallback to software rendering so we are using GL_NEAREST
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 //Linear filter might cause a fallback to software rendering so we are using GL_NEAREST_MIPMAP_NEAREST
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
 //Make sure your GPU support mipmaps with floating point textures
 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAPS, GL_TRUE);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE32F_ARB, width, height, 0, GL_LUMINANCE, GL_FLOAT, data);

If you setup some unsupported filter mode or wrap mode, or some unsupported texture format, it will fall to software vertex processing.

Another thing to remember is that the GPU doesn‘t know which mipmap to use. It has no way to compute the lambda factor.
You need to choose the mipmap in the VS yourself.
Here is an example of a VS.
Notice how the example uses texture2DLod() and it chooses mipmap 0.

 attribute vec2 inTexCoord;
 uniform sampler2D Texture0;
 uniform mat4 ProjectionModelviewMatrix;
 varying vec2 TexCoord;
 void main()
 {
     vec4 texel, newVertex;
     //Read the texture offset. Offset in the z direction only
     texel = texture2DLod(Texture0, inTexCoord, 0.0);
     newVertex = gl_Vertex;
     newVertex.z += texel.x;
     gl_Position = ProjectionModelviewMatrix * newVertex;
     TexCoord = inTexCoord;
 }

Vertex Fetch Texture (VTF)

时间: 2024-11-05 14:13:12

Vertex Fetch Texture (VTF)的相关文章

【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集

1 低级着色语言tgsi OpenGL程序使用GLSL语言对可编程图形处理器进行编程,GLSL语言(以下高级着色语言就是指GLSL)是语法类似C的高级语言,在GLSL规范中,GLSL语言被先翻译成教低级的类汇编语言,然后被翻译成硬件特定的指令集.OpenGL体系管理委员会于2002年6月和2002年9月分别通过了两个官方扩展:ARB_VERTEX_PROGRAM与ARB_FRAGMENT_PROGRAM来统一对低级着色语言的支持,GLSL语言被编译成针对这两个扩展的低级着色语言(因此这两个扩展可

PatentTips - Sprite Graphics Rendering System

BACKGROUND This disclosure relates generally to the field of computer graphics. More particularly, but not by way of limitation, it relates to technique for manipulating sprites in a rendering system for use with a graphics processor unit (GPU). A sp

Graphics processing architecture employing a unified shader

FIELD OF THE INVENTION The present invention generally relates to graphics processors and, more particularly, to a graphics processor architecture employing a single shader. BACKGROUND OF THE INVENTION In computer graphics applications, complex shape

【转】Life of a triangle - NVIDIA's logical pipeline

From:https://developer.nvidia.com/content/life-triangle-nvidias-logical-pipeline Since the release of the ground breaking Fermi architecture almost 5 years have gone by, it might be time to refresh the principle graphics architecture beneath it. Ferm

分析和通译“Vulkan in 30 minutes”文

本文主要对"Vulkan in 30 minutes"简单分析与通译,有什么错误请指正. I've written this post with a specific target audience in mind, namely those who have a good grounding in existing APIs (e.g. D3D11 and GL) and understand the concepts of multithreading, staging resou

Life of a triangle - NVIDIA's logical pipeline

Home GameWorks Blog Life of a triangle - NVIDIA's logical pipeline Life of a triangle - NVIDIA's logical pipeline Facebook Twitter LinkedIn Google+ By Christoph Kubisch, posted Mar 16 2015 at 12:52PM Tags: GameWorks GameWorks Expert Developer DX12 DX

OpenGL学习 Following the Pipeline

Passing Data to the Vertex Shader Vertex Attributes At the start of the OpenGL pipeline,we use the in keyword to bring inputs into the vertex shader. Between stages,in and out can be used to form conduits from shader to shader and pass databetween th

39. Volume Rendering Techniques

Milan Ikits University of Utah Joe Kniss University of Utah Aaron Lefohn University of California, Davis Charles Hansen University of Utah This chapter presents texture-based volume rendering techniques that are used for visualizing three-dimensional

第七章:3D模型渲染

原文链接: http://www.rastertek.com/gl40tut07.html Tutorial 7: 3D Model Rendering This tutorial will cover how to render 3D models in OpenGL 4.0 using GLSL. The code in this tutorial is based on the code from the diffuse lighting tutorial. 本章将介绍如何在OpenGL