VB6编程:DirectX 2D图形学习日志20伽玛校正
教程下载地址:https://download.csdn.net/download/gosub60/13696651
作用:通过按↑和下方向键改变Gamma的值,实现明度和灰度变化
总结:在源码最后
源码如下:需要一个图片配合。

'---------------------------------
'标题:DirectX教程
'
'描述:
'
'作者:Jacob Roman
'
'日期:2005年12月2日 翻译:gosub60@163.com QQ:127644712
'
'联系人:jacob_c_roman@hotmail.com
'---------------------------------Option Explicit''2D(已转换和已点燃)顶点格式类型。
Private Type TLVERTEXX As SingleY As SingleZ As SingleRHW As SingleColor As LongSpecular As LongTU As SingleTV As SingleEnd Type'一些颜色深度常数有助于使DX常数更具可读性。
Private Const COLOR_DEPTH_16_BIT As Long = D3DFMT_R5G6B5
Private Const COLOR_DEPTH_24_BIT As Long = D3DFMT_A8R8G8B8
Private Const COLOR_DEPTH_32_BIT As Long = D3DFMT_X8R8G8B8'2D(转换和点亮)顶点格式。
Private Const FVF_TLVERTEX As Long = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULARPrivate DirectX8 As DirectX8 '主DirectX对象。
Private Direct3D As Direct3D8 '控制3D一切。
Private Direct3D_Device As Direct3DDevice8 '表示硬件渲染
Private Direct3DX As D3DX8
Private Direct3D_Caps As D3DCAPS8Private Main_Font As D3DXFont
Private Main_Font_Description As IFont
Private Text_Rect As RECTPrivate Fullscreen_Enabled As Boolean '帮助确定它是否为全屏模式。
Private Running As Boolean '帮助确定主游戏循环是否正在运行。Private Vertex_List(3) As TLVERTEX '4个顶点将构成一个正方形Private Texture As Direct3DTexture8Private Gamma_Factor As Single'使用此功能可以更轻松地设置具有所需信息的顶点。
Private Function Create_TLVertex(X As Single, Y As Single, Z As Single, RHW As Single, Color As Long, Specular As Long, TU As Single, TV As Single) As TLVERTEXCreate_TLVertex.X = XCreate_TLVertex.Y = YCreate_TLVertex.Z = ZCreate_TLVertex.RHW = RHWCreate_TLVertex.Color = ColorCreate_TLVertex.Specular = SpecularCreate_TLVertex.TU = TUCreate_TLVertex.TV = TVEnd FunctionPrivate Function DirectX_Initialize() As BooleanOn Error GoTo Error_HandlerDim Display_Mode As D3DDISPLAYMODE '显示模式说明。Dim Direct3D_Window As D3DPRESENT_PARAMETERS 'Backbuffer和视口说明。Set DirectX8 = New DirectX8 '创建DirectX对象。Set Direct3D = DirectX8.Direct3DCreate() '使用DirectX对象创建Direct3D对象Set Direct3DX = New D3DX8If Fullscreen_Enabled = True Then'“现在我们正在全屏模式下工作,我们必须设置'屏幕分辨率切换为,而不是使用默认屏幕'解析度。Display_Mode.Width = 1024Display_Mode.Height = 768Display_Mode.Format = COLOR_DEPTH_32_BITDirect3D_Window.Windowed = False '该应用程序将处于全屏模式。Direct3D_Window.BackBufferCount = 1 '仅1个后缓冲Direct3D_Window.BackBufferWidth = Display_Mode.Width '使后缓冲宽度与显示宽度匹配Direct3D_Window.BackBufferHeight = Display_Mode.Height '使后缓冲高度与显示高度匹配Direct3D_Window.hDeviceWindow = frmMain.hWnd '使用frmMain作为设备窗口。ElseDirect3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Display_Mode '使用您当前使用的显示模式'已经在。 如果您感到困惑,我是'在谈论您当前的屏幕分辨率。 ;)Direct3D_Window.Windowed = True '该应用程序将处于窗口模式。End IfDirect3D_Window.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC '监视器运行时刷新。Direct3D_Window.BackBufferFormat = Display_Mode.Format '设置检索到后缓冲区中的格式。'使用一些有用的信息以及信息创建渲染设备'我们已经设置了Direct3D_Window。Set Direct3D_Device = Direct3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, Direct3D_Window)Direct3D_Device.SetVertexShader FVF_TLVERTEX '设置顶点着色的类型。 (需要)'不需要这些行,但能够过滤掉'使它们看起来更好的纹理。Direct3D_Device.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_POINTDirect3D_Device.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_POINTExit FunctionError_Handler:MsgBox "初始化DirectX时发生错误!", vbCriticalClose_ProgramDirectX_Initialize = FalseEnd FunctionPrivate Sub Create_Polygon()Vertex_List(0) = Create_TLVertex(0, 0, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 0, 0)Vertex_List(1) = Create_TLVertex(150, 0, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 1, 0)Vertex_List(2) = Create_TLVertex(0, 150, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 0, 1)Vertex_List(3) = Create_TLVertex(150, 150, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 1, 1)End SubPrivate Sub Load_Texture()Dim File_Path As StringDim Width As LongDim Height As LongDim Transparency_Color As LongFile_Path = App.Path & "\Texture.jpg"Width = 256Height = 256Transparency_Color = D3DColorRGBA(0, 0, 0, 0)Set Texture = Direct3DX.CreateTextureFromFileEx(Direct3D_Device, _File_Path, _Width, Height, _0, _0, _D3DFMT_A8R8G8B8, _D3DPOOL_MANAGED, _D3DX_FILTER_POINT, _D3DX_FILTER_POINT, _Transparency_Color, _ByVal 0, _ByVal 0)End SubPrivate Sub DirectX8_Set_Gamma(ByVal GammaFactor As Single, Red As Integer, Green As Integer, Blue As Integer)'注意:伽玛校正仅在全屏模式下有效。Direct3D_Device.GetDeviceCaps Direct3D_CapsIf (Direct3D_Caps.Caps2 And D3DCAPS2_FULLSCREENGAMMA) <> D3DCAPS2_FULLSCREENGAMMA Then Exit Sub'If (Direct3D_Caps.Caps2 And D3DCAPS2_CANCALIBRATEGAMMA) <> D3DCAPS2_CANCALIBRATEGAMMA Then Exit SubDim Gamma_Ramp As D3DGAMMARAMPDim Red_Value As LongDim Green_Value As LongDim Blue_Value As LongDim Unsigned_Integer_Red As LongDim Unsigned_Integer_Green As LongDim Unsigned_Integer_Blue As LongDim Current_Color As Long'创建线性伽玛斜坡For Current_Color = 0 To 255Unsigned_Integer_Red = 0Red_Value = Current_Color * GammaFactor * RedIf Red_Value > 32767 Then Red_Value = Red_Value - 32767: Unsigned_Integer_Red = 1If Red_Value > 32767 Then Red_Value = 32767Unsigned_Integer_Green = 0Green_Value = Current_Color * GammaFactor * GreenIf Green_Value > 32767 Then Green_Value = Green_Value - 32767: Unsigned_Integer_Green = 1If Green_Value > 32767 Then Green_Value = 32767Unsigned_Integer_Blue = 0Blue_Value = Current_Color * GammaFactor * BlueIf Blue_Value > 32767 Then Blue_Value = Blue_Value - 32767: Unsigned_Integer_Blue = 1If Blue_Value > 32767 Then Blue_Value = 32767'操作位以处理无符号整数Gamma_Ramp.Red(Current_Color) = Red_Value Or (-32768 * Unsigned_Integer_Red)Gamma_Ramp.Green(Current_Color) = Green_Value Or (-32768 * Unsigned_Integer_Green)Gamma_Ramp.Blue(Current_Color) = Blue_Value Or (-32768 * Unsigned_Integer_Blue)Next Current_Color'将伽玛斜面发送到设备。 如果其中一个无效,请尝试另一个。'Call Direct3D_Device.SetGammaRamp(D3DSGR_NO_CALIBRATION, Gamma_Ramp)Call Direct3D_Device.SetGammaRamp(D3DSGR_CALIBRATE, Gamma_Ramp)End SubPrivate Sub Game_Loop()Do While Running = TrueDoEvents '允许事件发生,以便程序不会锁定。'----------------------------------------------------'DirectX会自动为您处理帧速率'这使其运行(最多)与监视器一样快
'         刷新率高,因此您无需在其中添加额外的代码
'         降低循环速度并以一定数量的帧运行'每秒。'----------------------------------------------------'清除后缓冲。Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0Direct3D_Device.BeginScene'设置Gamma斜坡(仅在全屏模式下有效)DirectX8_Set_Gamma Gamma_Factor, 255, 255, 255'设置纹理Direct3D_Device.SetTexture 0, Texture'绘制多边形Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))If Fullscreen_Enabled = True Then'绘制文本。Direct3DX.DrawText Main_Font, D3DColorRGBA(255, 255, 255, 255), "按Up/Down(上/下)键改变Gamma值 " & vbCrLf & Gamma_Factor, Text_Rect, DT_TOP Or DT_LEFTElseDirect3DX.DrawText Main_Font, D3DColorRGBA(255, 255, 255, 255), "仅在全屏模式下工作", Text_Rect, DT_TOP Or DT_LEFTEnd IfDirect3D_Device.EndScene'将后缓冲区翻转到窗体窗口中。Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0LoopEnd SubPrivate Sub Close_Program()Running = False '这有助于程序退出游戏循环。'卸载所有DirectX对象。Set Texture = NothingSet Direct3DX = NothingSet Direct3D_Device = NothingSet Direct3D = NothingSet DirectX8 = NothingUnload Me '卸载窗体End ''结束程序'尽管上方的Unload语句退出了程序,但是您'这样做后将导致自动化错误?'END 命令 将有助于防止这种情况,并彻底结束该应用程序。End SubPrivate Sub Form_Activate()frmMain.Caption = "DirectX教程:改变Gamma值"DirectX_Initialize '初始化DirectX和Direct3D。Create_Polygon '创建多边形。Load_Texture '从文件加载纹理。Font.Name = "Arial"Font.Size = 14Set Main_Font_Description = FontSet Main_Font = Direct3DX.CreateFont(Direct3D_Device, Main_Font_Description.hFont)Text_Rect.Left = 20Text_Rect.Top = 160Text_Rect.Right = Text_Rect.Left + 300Text_Rect.bottom = Text_Rect.Top + 50Gamma_Factor = 1Running = True '全部初始化。 现在可以激活游戏循环了。Game_LoopEnd SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)Select Case KeyCodeCase vbKeyEscape '如果用户按Esc键则退出程序Close_ProgramCase vbKeyUpGamma_Factor = Gamma_Factor + 0.01Case vbKeyDownGamma_Factor = Gamma_Factor - 0.01End SelectIf Gamma_Factor >= 2 Then Gamma_Factor = 2If Gamma_Factor <= 0 Then Gamma_Factor = 0End SubPrivate Sub Form_Load()'窗口完全加载之前将触发此事件。If MsgBox("单击“是”进入全屏(推荐)", vbQuestion Or vbYesNo, "选项") = vbYes Then Fullscreen_Enabled = TrueEnd Sub
Private Sub Form_Unload(Cancel As Integer)Close_ProgramEnd Sub

程序分析
一、初始化过程:
① 同前边一样调用子程序:DirectX_Initialize '初始化DirectX和Direct3D。
② 创建多边形, 同前边一样调用子程序:Create_Polygon '创建多边形。
③加载纹理图片。同前边一样调用子程序:Load_Texture '从文件加载纹理。
④创建文本

Font.Name = "Arial"
Font.Size = 14
Set Main_Font_Description = Font
Set Main_Font = Direct3DX.CreateFont(Direct3D_Device, Main_Font_Description.hFont)
Text_Rect.Left = 20
Text_Rect.Top = 160
Text_Rect.Right = Text_Rect.Left + 300
Text_Rect.bottom = Text_Rect.Top + 50`

⑤初始化伽马值:Gamma_Factor = 1

二、 完成以上初始化后,进入Game_Loop子程序’游戏循环
在Game_Loop循环中,根据窗口标志Fullscreen_Enabled来判断窗口状态,如果Fullscreen_Enabled=false,那么提示:仅在全屏模式下工作,不改变伽马值。
否则,提示:按Up/Down(上/下)键改变Gamma值。

三、Form_KeyDown:按键检测
如果按下ESC那么退出程序
如果按下vbKeyUp(向上键),则伽马值+0.01
如果按下vbKeyDown(向下键),则伽马值-0.01
伽马值介于0-2之间。

四、使用DirectX8_Set_Gamma子程序控制伽马值的改变。

子程序声明:DirectX8_Set_Gamma(ByVal GammaFactor As Single, Red As Integer, Green As Integer, Blue As Integer)
GammaFactor 为伽马值,Red=红色,Green=绿色, Blue=蓝色

①检测硬件设备(显卡)是否支持伽马值修正

Private Direct3D_Caps As D3DCAPS8
Direct3D_Device.GetDeviceCaps Direct3D_Caps'该函数检索指定设备的设备指定信息
If (Direct3D_Caps.Caps2 And D3DCAPS2_FULLSCREENGAMMA) <> D3DCAPS2_FULLSCREENGAMMA Then Exit Sub

如果不支持就退出子程序调用。其中D3DCAPS枚举类型c++源码如下:

struct D3DCAPS8
{D3DDEVTYPE DeviceType;定义设备类型。UINT AdapterOrdinal;DWORD Caps, Caps2, Caps3;DWORD PresentationIntervals;DWORD CursorCaps;DWORD DevCaps;DWORD PrimitiveMiscCaps;DWORD RasterCaps;DWORD ZCmpCaps;DWORD SrcBlendCaps;DWORD DestBlendCaps;DWORD AlphaCmpCaps;DWORD ShadeCaps;DWORD TextureCaps;DWORD TextureFilterCaps;DWORD CubeTextureFilterCaps;DWORD VolumeTextureFilterCaps;DWORD TextureAddressCaps;DWORD VolumeTextureAddressCaps;DWORD LineCaps;DWORD MaxTextureWidth, MaxTextureHeight;DWORD MaxVolumeExtent;DWORD MaxTextureRepeat;DWORD MaxTextureAspectRatio;DWORD MaxAnisotropy;float MaxVertexW;float GuardBandLeft, GuardBandTop, GuardBandRight, GuardBandBottom;float ExtentsAdjust;DWORD StencilCaps;DWORD FVFCaps;DWORD TextureOpCaps;DWORD MaxTextureBlendStages;DWORD MaxSimultaneousTextures;DWORD VertexProcessingCaps;DWORD MaxActiveLights;DWORD MaxUserClipPlanes;DWORD MaxVertexBlendMatrices;DWORD MaxVertexBlendMatrixIndex;float MaxPointSize;DWORD MaxPrimitiveCount;DWORD MaxVertexIndex;DWORD MaxStreams;DWORD MaxStreamStride;DWORD VertexShaderVersion;DWORD MaxVertexShaderConst;DWORD PixelShaderVersion;float MaxPixelShaderValue;
};

②定义一个Gamma_Ramp(伽玛_斜坡)为D3DGAMMARAMP结构类型

Dim Gamma_Ramp As D3DGAMMARAMP

D3DGAMMARAMP结构如下VB6源码:

Type D3DGAMMARAMP
blue(0 To 255) As Integer
green(0 To 255) As Integer
red(0 To 255) As Integer

然后定义相关变量:

    Dim Red_Value As Long'红色值Dim Green_Value As Long'绿色值Dim Blue_Value As Long'蓝色值Dim Unsigned_Integer_Red As Long '无符号_整数_红色Dim Unsigned_Integer_Green As Long '无符号_整数_绿色Dim Unsigned_Integer_Blue As Long '无符号_整数_蓝色Dim Current_Color As Long'当前颜色

③创建线性伽玛斜坡

'创建线性伽玛斜坡For Current_Color = 0 To 255Unsigned_Integer_Red = 0Red_Value = Current_Color * GammaFactor * RedIf Red_Value > 32767 Then Red_Value = Red_Value - 32767: Unsigned_Integer_Red = 1If Red_Value > 32767 Then Red_Value = 32767Unsigned_Integer_Green = 0Green_Value = Current_Color * GammaFactor * GreenIf Green_Value > 32767 Then Green_Value = Green_Value - 32767: Unsigned_Integer_Green = 1If Green_Value > 32767 Then Green_Value = 32767Unsigned_Integer_Blue = 0Blue_Value = Current_Color * GammaFactor * BlueIf Blue_Value > 32767 Then Blue_Value = Blue_Value - 32767: Unsigned_Integer_Blue = 1If Blue_Value > 32767 Then Blue_Value = 32767'操作位以处理无符号整数Gamma_Ramp.Red(Current_Color) = Red_Value Or (-32768 * Unsigned_Integer_Red)Gamma_Ramp.Green(Current_Color) = Green_Value Or (-32768 * Unsigned_Integer_Green)Gamma_Ramp.Blue(Current_Color) = Blue_Value Or (-32768 * Unsigned_Integer_Blue)Next Current_Color

④最后,将伽玛斜面发送到设备。

'将伽玛斜面发送到设备。 如果其中一个无效,请尝试另一个。'Call Direct3D_Device.SetGammaRamp(D3DSGR_NO_CALIBRATION, Gamma_Ramp)Call Direct3D_Device.SetGammaRamp(D3DSGR_CALIBRATE, Gamma_Ramp)

以上就是本课的详解。

VB6编程:DirectX 2D图形学习日志20伽玛校正相关推荐

  1. VB6编程:DirectX 2D图形学习日志4:总结前3课

    VB6编程:DirectX 2D图形学习日志4:总结前1-3课 教程下载地址:https://download.csdn.net/download/gosub60/13696651 现在,我对源码中出 ...

  2. VB6编程:DirectX 2D图形学习日志22创建卡通动画

    VB6编程:DirectX 2D图形学习日志22创建卡通动画 教程下载地址:https://download.csdn.net/download/gosub60/13696651 作用:使用多幅BMP ...

  3. VB6编程:DirectX 2D图形学习日志1创建一个全屏窗口

    2020/12/11:从今天开始学习DirectX 2D图形编程,从0基础开始,希望能坚持下去.有兴趣一起学习的小伙伴可以关注我,当我有一周以上的时间没有发文,请发帖给我鼓鼓劲,毕竟自学编程是一件很辛 ...

  4. Win32 OpenGL编程(4) 2D图形基础(颜色及坐标体系进阶知识)

    Win32 OpenGL 编程 (4) 2D 图形基础(颜色及坐标体系进阶知识) write by 九天雁翎 (JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 ...

  5. Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 OpenGL系列文章都已经写到3D部分了,但是感觉2D的例子还是少了点,特意弄个外 ...

  6. DX9绘图基础-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(7)

    ** 绘图基础 ** 一:清除后备缓冲区 在度娘搜索 "DX9绘图"或者"DirectX9绘图",出来的东西不少,几乎找不到VB6的!还有会出来一个机器人,也叫 ...

  7. Java游戏编程---第一章 2D图形和动画

    第二章 2D图形和动画 全屏幕图形 在编程之前,我们先来看看硬件是怎样工作的.有两个显示硬件:显示卡和监视器. 显示卡在显卡内存中存储屏幕上显示的东西,它还有几个功能用来修改显示内容.显示卡还在后台把 ...

  8. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    Hadoop学习笔记-20.网站日志分析项目案例(一)项目介绍 网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edis ...

  9. 2021.1.17-Robocup 2D学习日志

    2021.1.17-Robocup 2D学习日志 环境平台 比赛平台server和monitor 球员客户端client 比赛规则 自动裁判 人为干预 基本的资料 环境平台 比赛平台server和mo ...

最新文章

  1. SQL Server 高可用性(三)共享磁盘
  2. 笔记-高项案例题-2018年上-计算题
  3. PHP——大话PHP设计模式——SPL数据结构
  4. Orleans 知多少 | 2. 核心概念一览
  5. JAVA实现汉字转换为拼音 pinyin4j/JPinyin
  6. linux内核编译后 make: 警告:检测到时钟错误.,系统时钟 make: 警告:检测到时钟错误。您的创建可能是不完整的。...
  7. 面试问题记录1:IP子网规划
  8. .NET组件程序设计0723
  9. 【精华版】cw2vec理论及其实现
  10. oracle32位迁移64位,Windows下Oracle10g32位遷移到11g64位
  11. benj™ 100+城市街拍电影人像调色LR预设/移动LR预设/LUT预设效果预览
  12. Android自动待机和唤醒,Android深度睡眠和唤醒锁
  13. 1-5(中文版)听力积累
  14. 淘宝商品详情页API接口、淘宝商品销量API接口、淘宝商品列表API接口、淘宝APP详情API接口、淘宝详情API接口
  15. 前端工程师第一篇-HTML(1)
  16. 不会查看GIT版本历史?快收藏这个工具
  17. BatchNorm和LayerNorm的比较
  18. MySQL数据库的常用命令
  19. 哈佛《幸福课》 第1课 什么是积极心理学
  20. python单链表就地反转_Python中的就地字典反转

热门文章

  1. 推荐系统_各种方法的损失计算过程
  2. 无线专题 wifi、AP、mac、phy、MII 、Ethernet Switch相关概念
  3. 怎么给图片加上红圈,红框,红箭头标重点等?还有添加文字
  4. 维克森林大学计算机科学,W 同学_维克森林大学_计算机_录取成功案例分享
  5. 计算机网络——域名系统(DNS)
  6. 国庆三亚自由行(Part 2 第二日之阳光沙滩美女烧烤)
  7. CISSP-D1-安全与风险管理
  8. 【附源码】计算机毕业设计SSM小区住户信息管理系统
  9. MySQL夺命连环15问,你能坚持到第几问?
  10. Github学生包申请流程