Giới thiệu, nội dung môn học Môn học cung cấp cho sinh viên những kiến thức lý thuyết và kỹ năng thực hành để sinh viên có thể xây dựng được những chương trình đồ họa ứng dụng. Sinh viên thông qua sử dụng thư viện lập trình đồ họa OpenGL để tiếp cận dễ hơn, hiểu sâu hơn về các khái niệm, giải thuật đồ họa. Nội dung tóm tắt môn học: Khái quát về kiến trúc phần cứng, phần mềm của đồ họa. Giới thiệu về cấu trúc chương trình sử dụng thư viện lập trình đồ họa OpenGL. Ôn tập các kiến thức toán được sử dụng trong đồ họa như vector, ma trận Tìm hiểu các khâu trong đường ống đồ họa như biến đổi hình, chuyển đổi sang hệ trục tọa độ camera, phép chiếu, tô màu, dán texture. Các giải thuật rasterization để chuyển hình ảnh ra thiết bị hiển thị như Bresenham, Michener, Floodfill, Run of pixels, Scanline. Sử dụng thư viện lập trình OpenGL để xây dựng chương trình đồ họa đơn giản L.O.1.1 – Trình bày định nghĩa đồ họa máy tính, liệt kê được một số ứng dụng của đồ họa máy tính L.O.1.1 – Liệt kê đồng thời mô tả được chức năng của các thành phần của phần cứng hệ thống đồ họa máy tính L.O.1.2 – Mô tả được hoạt động của thiết bị hiển thị dạng raster L.O.1.3 – Mô tả được chức năng của bộ đệm frame L.O.1.4 – Trình bày khái niệm đường ống đồ họa, liệt kê và nêu chức năng của các thành phần trong đường ống đồ họa L.O.1.5 – Trình bày về các đối tượng cơ bản trong đồ họa máy tính L.O.1.5 – Hiểu và ứng dụng cửa sổ (window) và khung nhìn (viewport) trong đồ họa máy tính Các kiến thức toán trong đồ họa L.O.2.1 – Trình bày khái niệm về vector L.O.2.2 – Trình bày được định nghĩa và ứng dụng của phép toán tính vô hướng và tích có hướng trong đồ họa L.O.2.3 – Biết cách biểu diễn và vẽ đường cong dưới dạng tham số L.O.2.4 – Biết cách biểu diễn đồng nhất điểm và vector L.O.2.5 – Làm được các phép toán trên ma trận như nhân ma trận, chuyển vị ma trận, tính ma trận nghịch đảo, v.v. L.O.2.6 – Biết cách chuyển đổi biểu diễn điểm và vector trong các hệ tọa độ khác nhau Phép biến đổi hình L.O.3.1 – Trình bày được định nghĩa của phép biến đổi affine L.O.3.2 – Liệt kê được các phép biến đổi cơ bản cùng với ma trận tương ứng L.O.3.3 – Biết cách phân rã một phép biến đổi bất kỳ thành hợp của các phép biến đổi cơ bản, để từ đó tính ma trận của phép biến đổi L.O.3.4 – Biết cách đưa ma trận của phép biến đổi hình vào đường ống đồ họa bằng những cách khác nhau. L.O.3.5 – Trình bày khái niệm ngăn xếp ma trận, đồng thời biết cách sử dụng ngăn xếp ma trận Phép nhìn và phép chiếu L.O.4.1 – Trình bày định nghĩa các phép chiếu phẳng hay được sử dụng trong kỹ thuật L.O.4.2 – Tính được các vector đơn vị u, v, n của hệ trục tọa độ camera L.O.4.3 – Tính được ma trận V dùng để biến đổi tọa độ đối tượng từ hệ tọa độ thế giới thực sang hệ trục tọa độ camera L.O.4.4 – Tính được ma trận P dùng để biến đổi thể tích nhìn của phép chiếu trực giao thành thể tích nhìn chuẩn CCV L.O.4.5 – Tính được ma trận P dùng để biến đổi thể tích nhìn của phép chiếu phối cảnh thành thể tích nhìn chuẩn CCV L.O.4.6 – Tính được ma trận P dùng để biến đổi thể tích nhìn của phép chiếu xiên thành thể tích nhìn chuẩn CCV L.O.4.7 – Biết cách đưa ma trận P vào đường ống đồ họa bằng những cách khác nhau. Chiếu sáng và tô màu L.O.5.1 – Trình bày được các phương pháp vẽ hình với độ chân thật khác nhau như vẽ khung dây, tô màu phẳng, tô màu trơn, thêm bóng đổ, dán texture L.O.5.2 – Trình bày mô hình lý thuyết của việc chiếu sáng và tô màu L.O.5.3 – Tính được các thành phần màu sắc khác nhau như màu sắc khuếch tán, màu sắc phản chiếu, màu sắc môi trường L.O.5.4 – Biết cách nội suy màu sắc bằng phương pháp Gouraud L.O.5.5 – Biết cách nội suy pháp tuyến và màu sắc bằng phương pháp Phong L.O.5.6 – Biết cách tính được pháp tuyến tại điểm bất kỳ trên bề mặt đối tượng Cắt xén đối tượng với thể tích nhìn L.O.6.1 – Mã hóa được tọa độ đầu mút đoạn thẳng trong giải thuật Cohen Sutherland L.O.6.2 – Chạy từng bước giải thuật Cohen – Sutherland để cắt xén đoạn thẳng với thể tích nhìn L.O.6.3 – Trình bày được phương pháp cắt xén đa giác bất kỳ với thể tích nhìn Kết xuất các đối tượng đồ họa cơ bản ra thiết bị raster L.O.7.1 – Trình bày và chạy từng bước giải thuật Bresenham để vẽ đoạn thẳng ra thiết bị raster L.O.7.2 – Trình bày và chạy từng bước giải thuật Michener để vẽ đường tròn ra thiết bị raster L.O.7.3 – Trình bày và chạy từng bước giải thuật tô màu cho vùng tô bằng phương pháp Floodfill L.O.7.4 – Trình bày và chạy từng bước giải thuật tô màu cho vùng tô bằng phương pháp Run of Pixels L.O.7.5 – Trình bày và chạy từng bước giải thuật tô màu cho vùng tô bằng phương pháp Scanline Dán texture lên bề mặt đối tượng L.O.8.1 – Liệt kê được các loại bộ đệm được sử dụng trong đồ họa máy tính L.O.8.2 – Liệt kê được thao tác Bitwise được áp dụng để thao tác trực tiếp lên bộ đệm màu sắc L.O.8.3 – Trình bày được khái niệm và ứng dụng của bit map và pixel map L.O.8.4 – Trình bày được các phương pháp ánh xạ texture lên bề mặt đối tượng L.O.8.5 – Tính được tọa độ texture L.O.8.6 – Trình bày được trình tự các bước để dán texture lên bề mặt đối tượng Sử dụng thư viện lập trình đồ họa OpenGL L.O.9.1 – Hiểu được cấu trúc của chương trình sử dụng thư viện lập trình đồ họa OpenGL L.O.9.2 – Biết sử dụng hàm và tham số thích hợp để vẽ các đối tượng đồ họa cơ bản, đồng thời biết các phân rã đối tượng phức tạp thành các đối tượng đồ họa cơ bản L.O.9.6 – Biết sử dụng hàm và tham số thích hợp để lập trình đồ họa tương tác L.O.9.3 – Biết sử dụng hàm và tham số thích hợp để thực hiện phép biến đổi hình L.O.9.4 – Biết sử dụng hàm và tham số thích hợp để thiết lập camera L.O.9.5 – Biết sử dụng hàm và tham số thích hợp để chiếu sáng và tô màu cho đối tượng L.O.9.6 – Biết sử dụng hàm và tham số thích hợp để dán texture lên bề mặt đối tượng Kết quả cần đạt được Kiến thức: L.O.1 – Giải thích được các khái niệm cơ bản về hệ thống đồ họa máy tính. L.O.2 – Các kiến thức toán trong đồ họa. L.O.3– Phép biến đổi hình. L.O.4 – Phép nhìn và phép chiếu. L.O.5 – Chiếu sáng và tô màu. L.O.6 – Cắt xén đối tượng với thể tích nhìn. L.O.7 – Kết xuất các đối tượng đồ họa cơ bản ra thiết bị raster. L.O.8 – Dán texture lên bề mặt đối tượng. Kỹ năng: L.O.9 – Sử dụng thư viện lập trình đồ họa OpenGL.
CuuDuongThanCong.com https://fb.com/tailieudientucntt OpenGL ® Programming Guide Seventh Edition CuuDuongThanCong.com https://fb.com/tailieudientucntt ® OpenGL Series Visit informit.com /opengl for a complete list of available products T he OpenGL graphics system is a software interface to graphics hardware (“GL” stands for “Graphics Library.”) It allows you to create interactive programs that produce color images of moving, threedimensional objects With OpenGL, you can control computer-graphics technology to produce realistic pictures, or ones that depart from reality in imaginative ways The OpenGL Series from Addison-Wesley Professional comprises tutorial and reference books that help programmers gain a practical understanding of OpenGL standards, along with the insight needed to unlock OpenGL’s full potential CuuDuongThanCong.com https://fb.com/tailieudientucntt OpenGL ® Programming Guide Seventh Edition The Official Guide to Learning OpenGL®, Versions 3.0 and 3.1 Dave Shreiner The Khronos OpenGL ARB Working Group Upper Saddle River, NJ • Boston • Indianapolis • San Francisco New York • Toronto • Montreal • London • Munich • Paris • Madrid Capetown • Sydney • Tokyo • Singapore • Mexico City CuuDuongThanCong.com https://fb.com/tailieudientucntt Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks Where those designations appear in this book, and the publisher was aware of a trademark claim, the designations have been printed with initial capital letters or in all capitals The authors and publisher have taken care in the preparation of this book, but make no expressed or implied warranty of any kind and assume no responsibility for errors or omissions No liability is assumed for incidental or consequential damages in connection with or arising out of the use of the information or programs contained herein The publisher offers excellent discounts on this book when ordered in quantity for bulk purchases or special sales, which may include electronic versions and/or custom covers and content particular to your business, training goals, marketing focus, and branding interests For more information, please contact: U.S Corporate and Government Sales (800) 382-3419 corpsales@pearsontechgroup.com For sales outside of the U.S., please contact: International Sales international@pearsoned.com Visit us on the Web: informit.com/aw Library of Congress Cataloging-in-Publication Data Shreiner, Dave OpenGL programming guide : the official guide to learning OpenGL, versions 3.0 and 3.1 / Dave Shreiner; the Khronos OpenGL ARB Working Group — 7th ed p cm Includes index ISBN 978-0-321-55262-4 (pbk : alk paper) Computer graphics OpenGL I Title T385.O635 2009 006.6'6—dc22 2009018793 Copyright © 2010 Pearson Education, Inc All rights reserved Printed in the United States of America This publication is protected by copyright, and permission must be obtained from the publisher prior to any prohibited reproduction, storage in a retrieval system, or transmission in any form or by any means, electronic, mechanical, photocopying, recording, or likewise For information regarding permissions, write to: Pearson Education, Inc Rights and Contracts Department 501 Boylston Street, Suite 900 Boston, MA 02116 Fax (617) 671-3447 ISBN 13: 978-0-321-55262-4 ISBN 10: 0-321-55262-8 Text printed in the United States on recycled paper at Edwards Brothers in Ann Arbor, Michigan First printing, July 2009 CuuDuongThanCong.com https://fb.com/tailieudientucntt For my family—Felicity, Max, Sarah, and Scout —JLN For my family—Ellyn, Ricky, and Lucy —TRD To Tom Doeppner and Andy van Dam, who started me along this path —MW For my family—Vicki, Bonnie, Bob, Phantom, Squiggles, Tuxedo, and Toby —DRS In memory of Phil Karlton, Celeste Fowler, and Ben Cheatham CuuDuongThanCong.com https://fb.com/tailieudientucntt This page intentionally left blank CuuDuongThanCong.com https://fb.com/tailieudientucntt Contents Figures xxi Tables xxv Examples xxix About This Guide xxxv What This Guide Contains xxxv What’s New in This Edition xxxviii What You Should Know Before Reading This Guide xl How to Obtain the Sample Code xli Errata xlii Style Conventions .xlii Distinguishing Deprecated Features xliii Acknowledgments xlv Introduction to OpenGL What Is OpenGL? A Smidgen of OpenGL Code OpenGL Command Syntax OpenGL as a State Machine OpenGL Rendering Pipeline 10 Display Lists 11 Evaluators 11 Per-Vertex Operations 12 Primitive Assembly 12 vii CuuDuongThanCong.com https://fb.com/tailieudientucntt Pixel Operations 13 Texture Assembly 13 Rasterization 14 Fragment Operations 14 OpenGL-Related Libraries 14 Include Files 15 GLUT, the OpenGL Utility Toolkit 17 Animation 22 The Refresh That Pauses 23 Motion = Redraw + Swap 24 OpenGL and Its Deprecation Mechanism 27 OpenGL Contexts 27 Accessing OpenGL Functions 29 State Management and Drawing Geometric Objects 31 A Drawing Survival Kit 34 Clearing the Window 34 Specifying a Color 37 Forcing Completion of Drawing 38 Coordinate System Survival Kit 40 Describing Points, Lines, and Polygons 42 What Are Points, Lines, and Polygons? 42 Specifying Vertices 46 OpenGL Geometric Drawing Primitives 47 Basic State Management 53 Displaying Points, Lines, and Polygons 55 Point Details 55 Line Details 56 Polygon Details 60 Normal Vectors 68 Vertex Arrays 70 Step 1: Enabling Arrays 72 Step 2: Specifying Data for the Arrays 73 Step 3: Dereferencing and Rendering 77 Restarting Primitives 83 Instanced Drawing 86 Interleaved Arrays 88 viii Contents CuuDuongThanCong.com https://fb.com/tailieudientucntt Buffer Objects .91 Creating Buffer Objects 92 Making a Buffer Object Active .93 Allocating and Initializing Buffer Objects with Data 93 Updating Data Values in Buffer Objects 96 Copying Data Between Buffer Objects 101 Cleaning Up Buffer Objects 102 Using Buffer Objects with Vertex-Array Data 102 Vertex-Array Objects 104 Attribute Groups .110 Some Hints for Building Polygonal Models of Surfaces .113 An Example: Building an Icosahedron 115 Viewing 123 Overview: The Camera Analogy 126 A Simple Example: Drawing a Cube 129 General-Purpose Transformation Commands .134 Viewing and Modeling Transformations 137 Thinking about Transformations 137 Modeling Transformations 140 Viewing Transformations .146 Projection Transformations 152 Perspective Projection 153 Orthographic Projection 156 Viewing Volume Clipping 158 Viewport Transformation 158 Defining the Viewport 159 The Transformed Depth Coordinate 161 Troubleshooting Transformations 162 Manipulating the Matrix Stacks 164 The Modelview Matrix Stack 167 The Projection Matrix Stack 168 Additional Clipping Planes .168 Examples of Composing Several Transformations 172 Building a Solar System 172 Building an Articulated Robot Arm 175 Reversing or Mimicking Transformations 179 Contents CuuDuongThanCong.com https://fb.com/tailieudientucntt ix Function Syntax Description gvec4 textureLod(SAMPLER1D sampler, float coord, float lod) gvec4 textureLod(SAMPLER2D sampler, vec2 coord, float lod) gvec4 textureLod(SAMPLER3D sampler, vec3 coord, float lod) gvec4 textureLod(SAMPLERCube sampler, vec3 coord, float lod) gvec4 textureLod(SAMPLER1DShadow sampler, vec3 coord, float lod) gvec4 textureLod(SAMPLER2DShadow sampler, vec3 coord, float lod) gvec4 textureLod(SAMPLER1DArray sampler, vec2 coord, float lod) gvec4 textureLod(SAMPLER2DArray sampler, vec2 coord, float lod) gvec4 textureLod(SAMPLER1DArrayShadow sampler, vec2 coord, float lod) Sample from the single mipmap level specified by lod These calls also set all partial derivatives associated with mipmap-level interpolation to zero gvec4 textureLodOffset(SAMPLER1D sampler, float coord, float lod, int offset) gvec4 textureLodOffset(SAMPLER2D sampler, vec2 coord, float lod, ivec2 offset) gvec4 textureLodOffset(SAMPLER3D sampler, vec3 coord, float lod, ivec3 offset) float textureLodOffset( SAMPLER1DShadow sampler, vec3 coord, float lod, ivec offset) float textureLodOffset( SAMPLER2DShadow sampler, vec3 coord, float lod, ivec offset) gvec4 textureLodOffset( SAMPLER1DArray sampler, vec2 coord, float lod, ivec offset) gvec4 textureLodOffset( SAMPLER2DArray sampler, vec2 coord, float lod, ivec offset) float textureLodOffset( SAMPLER1DArrayShadow sampler, vec2 coord, float lod, ivec offset) Sample from the single mipmap level specified by lod, using the coordinates supplied in coord after being offset by the values supplied in offset These calls also set all partial derivatives associated with mipmap-level interpolation to zero Table I-26 28 Explicit Texture LOD Access Functions Appendix I: Built-In OpenGL Shading Language Variables and Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt Explicit Gradient Texture Access Functions The following functions sample a texture using the user-supplied gradients in the mipmap level determination The *Offset forms apply the specified offset, similar to the operation of the texelOffset() routines, to the provided coordinates before texture sampling Function Syntax Description gvec4 textureGrad(SAMPLER1D sampler, float coord, float dPdx, float dPdy) gvec4 textureGrad(SAMPLER2D sampler, vec2 coord, vec2 dPdx, vec2 dPdy) gvec4 textureGrad(SAMPLER3D sampler, vec3 coord, vec3 dPdx, vec3 dPdy) gvec4 textureGrad(SAMPLERCube sampler, vec3 coord, vec3 dPdx, vec3 dPdy) float textureGrad(SAMPLER1DShadow sampler, vec3 coord, float dPdx, float dPdy) float textureGrad(SAMPLER2DShadow sampler, vec3 coord, vec2 dPdx, vec2 dPdy) float textureGrad(SAMPLERCubeShadow sampler, vec4 coord, vec3 dPdx, vec3 dPdy) gvec4 textureGrad(SAMPLER1DArray sampler, vec2 coord, float dPdx, float dPdy) gvec4 textureGrad(SAMPLER2DArray sampler, vec3 coord, vec2 dPdx, vec2 dPdy) float textureGrad(SAMPLER1DArrayShadow sampler, vec3 coord, float dPdx, float dPdy) float textureGrad(SAMPLER2DShadow sampler, vec4 coord, vec2 dPdx, vec2 dPdy) Sample a texture using the provided explicit gradients The partial derivatives are with respect to the window x and y coordinates Added in GLSL 1.40: gvec4 textureGrad(SAMPLER2DRect sampler, vec2 coord, vec2 dPdx, vec2 dPdy) float textureGrad(SAMPLER2DRectShadow sampler, vec3 coord, vec2 dPdx, vec2 dPdy) Table I-27 Explicit Gradient Texture Access Functions Built-In Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt 29 Function Syntax Description gvec4 textureGradOffset(SAMPLER1D sampler, float coord, float dPdx, float dPdy) gvec4 textureGradOffset(SAMPLER2D sampler, vec2 coord, vec2 dPdx, vec2 dPdy) gvec4 textureGradOffset(SAMPLER3D sampler, vec3 coord, vec3 dPdx, vec3 dPdy) gvec4 textureGradOffset(SAMPLERCube sampler, vec3 coord, vec3 dPdx, vec3 dPdy) float textureGradOffset(SAMPLER1DShadow sampler, vec3 coord, float dPdx, float dPdy) float textureGradOffset(SAMPLER2DShadow sampler, vec3 coord, vec2 dPdx, vec2 dPdy) float textureGradOffset(SAMPLERCubeShadow sampler, vec4 coord, vec3 dPdx, vec3 dPdy) gvec4 textureGradOffset(SAMPLER1DArray sampler, vec2 coord, float dPdx, float dPdy) gvec4 textureGradOffset(SAMPLER2DArray sampler, vec3 coord, vec2 dPdx, vec2 dPdy) float textureGradOffset(SAMPLER1DArrayShadow sampler, vec3 coord, float dPdx, float dPdy) float textureGradOffset(SAMPLER2DShadow sampler, vec4 coord, vec2 dPdx, vec2 dPdy) Sample a texture using the provided explicit gradient values The provided offset is applied to the texture coordinates before sampling Added in GLSL 1.40: gvec4 textureGradOffset(SAMPLER2DRect sampler, vec2 coord, vec2 dPdx, vec2 dPdy) float textureGradOffset(SAMPLER2DShadow sampler, vec3 coord, vec2 dPdx, vec2 dPdy) Table I-27 30 (continued) Explicit Gradient Texture Access Functions Appendix I: Built-In OpenGL Shading Language Variables and Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt Combination Texture Access Functions The following routines provide combinations of the other routines for texture access For example, the textureProjLod() function does a projective texture sample on a single mipmap level As always, the *Offset() variants apply a coordinate offset before sampling the texture, similar to textureOffset() Function Syntax Description gvec4 textureProjLod(SAMPLER1D sampler, vec2 coord, float lod) gvec4 textureProjLod(SAMPLER1D sampler, vec4 coord, float lod) gvec4 textureProjLod(SAMPLER2D sampler, vec3 coord, float lod) gvec4 textureProjLod(SAMPLER2D sampler, vec4 coord, float lod) gvec4 textureProjLod(SAMPLER3D sampler, vec4 coord, float lod) float textureProjLod(SAMPLER1DShadow sampler, vec4 coord, float lod) float textureProjLod(SAMPLER2DShadow sampler, vec4 coord, float lod) Sample a texture using a projective lookup within an explicit LOD gvec4 textureProjLodOffset(SAMPLER1D sampler, vec2 coord, float lod, int offset) gvec4 textureProjLodOffset(SAMPLER1D sampler, vec4 coord, float lod, int offset) gvec4 textureProjLodOffset(SAMPLER2D sampler, vec3 coord, float lod, ivec2 offset) gvec4 textureProjLodOffset(SAMPLER2D sampler, vec4 coord, float lod, ivec2 offset) gvec4 textureProjLodOffset(SAMPLER3D sampler, vec4 coord, float lod, ivec3 offset) float textureProjLodOffset( SAMPLER1DShadow sampler, vec4 coord, float lod, int offset) float textureProjLodOffset( SAMPLER2DShadow sampler, vec4 coord, float lod, ivec2 offset) Sample a texture using a projective lookup within an explicit LOD, offsetting the supplied coordinates Table I-28 Projected, LOD, and Gradient Combined Texture Access Functions Built-In Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt 31 Function Syntax Description gvec4 textureProjGrad(SAMPLER1D sampler, vec2 coord, float dPdx, float dPdy) gvec4 textureProjGrad(SAMPLER1D sampler, vec4 coord, float dPdx, float dPdy) gvec4 textureProjGrad(SAMPLER2D sampler, vec3 coord, vec2 dPdx, vec2 dPdy) gvec4 textureProjGrad(SAMPLER2D sampler, vec4 coord, vec2 dPdx, vec2 dPdy) gvec4 textureProjGrad(SAMPLER3D sampler, vec4 coord, vec3 dPdx, vec3 dPdy) float textureProjGrad(SAMPLER1DShadow sampler, vec4 coord, float dPdx, float dPdy) float textureProjGrad(SAMPLER2DShadow sampler, vec4 coord, float dPdx, float dPdy) Sample a texture using a projective lookup with an explicit gradient Added in GLSL 1.40: gvec4 textureProjGrad(SAMPLER2DRect sampler, vec3 coord, vec2 dPdx, vec2 dPdy) gvec4 textureProjGrad(SAMPLER2DRect sampler, vec4 coord, vec2 dPdx, vec2 dPdy) float textureProjGrad(SAMPLER2DRectShadow sampler, vec4 coord, float dPdx, float dPdy) Table I-28 32 (continued) LOD,LOD, and Gradient Combined Texture Access (continued) Projected, Projected, and Gradient Combined Texture Functions Appendix I: Built-In OpenGL Shading Language Variables and Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt Function Syntax Description gvec4 textureProjGradOffset(SAMPLER1D sampler, vec2 coord, float dPdx, float dPdy, int offset) gvec4 textureProjGradOffset(SAMPLER1D sampler, vec4 coord, float dPdx, float dPdy, int offset) gvec4 textureProjGradOffset(SAMPLER2D sampler, vec3 coord, vec2 dPdx, vec2 dPdy, ivec2 offset) gvec4 textureProjGradOffset(SAMPLER2D sampler, vec4 coord, vec2 dPdx, vec2 dPdy, ivec2 offset) gvec4 textureProjGradOffset(SAMPLER3D sampler, vec4 coord, vec3 dPdx, vec3 dPdy, ivec3 offset) float textureProjGradOffset( SAMPLER1DShadow sampler, vec4 coord, float dPdx, float dPdy, int offset) float textureProjGradOffset( SAMPLER2DShadow sampler, vec4 coord, vec2 dPdx, vec2 dPdy, ivec2 offset) Sample a texture using a projective lookup with an explicit gradient., offsetting the supplied coordinates Added in GLSL 1.40: gvec4 textureProjGradOffset(SAMPLER2DRect sampler, vec3 coord, vec2 dPdx, vec2 dPdy, ivec2 offset) gvec4 textureProjGradOffset(SAMPLER2DRect sampler, vec4 coord, vec2 dPdx, vec2 dPdy, ivec2 offset) float textureProjGradOffset( SAMPLER2DRectShadow sampler, vec4 coord, vec2 dPdx, vec2 dPdy, ivec2 offset) Table Table I-28 I-28 (continued) LOD,LOD, and Gradient Combined Texture Access (continued) Projected, Projected, and Gradient Combined Texture Functions Deprecated Texture Access Functions The following set of functions were deprecated in GLSL Version 1.30, but had not been removed from the language as of the time of this book’s publication Projective Texture Access Functions The following functions retrieve a texel from the texture map associated with sampler Before the texel is retrieved, all components of the input texture coordinate, coord, are divided by the last coordinate Built-In Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt 33 Function Syntax Description vec4 texture1D(sampler1D sampler, float coord) vec4 texture1D(sampler1D sampler, float coord, float bias) Samples a one-dimensional texture map, with optional mipmap-level biasing vec4 texture2D(sampler2D sampler, vec2 coord) vec4 texture2D(sampler2D sampler, vec2 coord, float bias) Samples a two-dimensional texture map, with optional mipmap-level biasing vec4 texture3D(sampler3D sampler, vec3 coord) vec4 texture3D(sampler3D sampler, vec3 coord, float bias) Samples a three-dimensional texture map, with optional mipmap-level biasing Table I-29 Deprecated Basic Texture Access Functions All forms are accepted by fragment shaders Functions with the bias parameter are not accepted in vertex shaders Once again, The optional bias parameter is used to alter which mipmap is sampled (see “Calculating the Mipmap Level” in Chapter 9) If a bias value is provided while accessing a texture that does not contain mipmaps, the texture is accessed directly and the value is ignored The bias forms of the texture functions are only available in fragment shaders Function Syntax Description vec4 texture1DProj(sampler1D sampler, vec2 coord) vec4 texture1DProj(sampler1D sampler, vec4 coord) vec4 texture1DProj(sampler1D sampler, vec2 coord, float bias) vec4 texture1DProj(sampler1D sampler, vec4 coord, float bias) Samples a one-dimensional texture map, with optional mipmap-level biasing The input texture coordinate is divided by the last texture coordinates (coord.s for the vec2 call; coord.q for the vec4 call) Table I-30 34 Projective Texture Access Functions Appendix I: Built-In OpenGL Shading Language Variables and Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt Function Syntax Description vec4 texture2DProj(sampler2D sampler, vec3 coord) vec4 texture2DProj(sampler2D sampler, vec4 coord) vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias) vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias) Samples a two-dimensional texture map, with optional mipmap-level biasing The input texture coordinate is divided by the last texture coordinates (coord.t for the vec2 call; coord.q for the vec4 call) vec4 texture3DProj(sampler3D sampler, vec4 coord) vec4 texture3DProj(sampler3D sampler, vec4 coord, float bias) Samples a three-dimensional texture map, with optional mipmap-level biasing The input texture coordinate is divided by the last texture coordinates (coord.p for the vec2 call; coord.q for the vec4 call) Table I-30 Projective Texture Access Functions Vertex Shader Texture Access Functions Texel retrieval in vertex shaders does not include the automatic computation of a mipmap level, as happens in a fragment shader The following functions allow for the sampling of mipmapped textures by vertex shaders by providing an mipmap level-of-detail, or lod value (see “Calculating the Mipmap Level” in Chapter for how to compute the levelof-detail value) The vertex shader versions of the texture access functions are available in non-projective and projective forms (those calls that include “Proj” in the name The input texture coordinates for the projective forms are processed as described in “Projective Texture Access Functions” on page 33 Function Syntax Description vec4 texture1DLod(sampler1D sampler, float coord, float lod) vec4 texture1DProjLod(sampler1D sampler, vec2 coord, float lod) vec4 texture1DProjLod(sampler1D sampler, vec4 coord, float lod) Samples a one-dimensional texture map by specifying the mipmap level-of-detail Table I-31 Vertex Shader Texture Access Functions Built-In Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt 35 Function Syntax Description vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod) vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod) vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod) Samples a two-dimensional texture map by specifying the mipmap level-of-detail vec4 texture3DLod(sampler3D sampler, vec3 coord, float lod) vec4 texture3DProjLod(sampler3D sampler, vec4 coord, float lod) Samples a three-dimensional texture map by specifying the mipmap level-of-detail Table I-31 (continued) Vertex Shader Texture Access Functions Cube-Map Texture Access Functions Retrieve the texel at input texture coordinate, coord, in the cube map texture currently bound to sampler The direction of coord is used to select which face to a two-dimensional texture lookup in Function Syntax Description vec4 textureCube(samplerCube sampler, vec3 coord) vec4 textureCube(samplerCube sampler, vec3 coord, float bias) vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod) Samples a cube-mapped texture, with optional bias (fragment shader only) or lod parameters Table I-32 Cube-Map Texture Access Functions Shadow-Map Texture Access Functions If a non-shadow texture call is made to a sampler that represents a depth texture with depth comparisons turned on, then results are undefined If a shadow texture call is made to a sampler that represents a depth texture with depth comparisons turned off, then results are undefined If a shadow texture call is made to a sampler that does not represent a depth texture, then results are undefined 36 Appendix I: Built-In OpenGL Shading Language Variables and Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt Function Syntax Description vec4 shadow1D(sampler1DShadow sampler, vec3 coord) vec4 shadow2D(sampler2DShadow sampler, vec3 coord) vec4 shadow1D(sampler1DShadow sampler, vec3 coord, float bias) vec4 shadow2D(sampler2DShadow sampler, vec3 coord, float bias) vec4 shadow1DProj(sampler1DShadow sampler, vec4 coord) vec4 shadow2DProj(sampler2DShadow sampler, vec4 coord) vec4 shadow1DProj(sampler1DShadow sampler, vec4 coord, float bias) vec4 shadow2DProj(sampler2DShadow sampler, vec4 coord, float bias) vec4 shadow1DLod(sampler1DShadow sampler, vec3 coord, float lod) vec4 shadow2DLod(sampler2DShadow sampler, vec3 coord, float lod) vec4 shadow1DProjLod(sampler1DShadow sampler, vec4 coord, float lod) vec4 shadow2DProjLod(sampler2DShadow sampler, vec4 coord, float lod) Sample a shadow depth map The functions utilizing the bias parameter are only available in fragment shaders Table I-33 The LOD and projective versions of the functions process texture coordinates similarly to other LOD and projective functions, respectively Shadow-Map Texture Access Functions Fragment Processing Functions Table I-34 describes the functions for accessing a fragment’s derivative, which are computed as the fragments of the underlying geometric primitive are rasterized Function Syntax Description TYPE dFdx(TYPE p) Returns the derivative in the x-direction TYPE dFdy(TYPE p) Returns the derivative in the y-direction TYPE fwidth(TYPE p) Returns dFdx p + dFdy p Table I-34 Fragment Derivative Functions Built-In Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt 37 Noise Functions The stochastic noise functions described in Table I-35 are available in both vertex and fragment shaders The computed noise values returned are pseudo-random, but repeatable provided the same random number seed is used Function Syntax Description float noise1(TYPE x) Returns a 1D noise value based on the input value x vec2 noise2(TYPE x) Returns a 2D noise value based on the input value x vec3 noise3(TYPE x) Returns a 3D noise value based on the input value x vec4 noise4(TYPE x) Returns a 4D noise value based on the input value x Table I-35 38 Random-Noise Generation Functions Appendix I: Built-In OpenGL Shading Language Variables and Functions CuuDuongThanCong.com https://fb.com/tailieudientucntt Appendix J J.Floating-Point Formats for Textures, Framebuffers, and Renderbuffers This appendix will describe the floating-point formats used for pixel storage in framebuffers and renderbuffers, and texel storage in textures It has the following major sections: • “Floating-Point Formats Used in OpenGL” CuuDuongThanCong.com https://fb.com/tailieudientucntt Floating-Point Formats Used in OpenGL In addition to the normal 32-bit single-precision floating-point values you are used to using when you declare a GLfloat in your application, OpenGL supports reduced-precision floating-point representations for storing data more compactly than its 32-bit representation In many instances, your floating-point data may not require the entire dynamic range of a 32-bit float, and storing or processing data in a reduced-precision format may save memory, and increase data transfer rates OpenGL supports three reduce-precision floating-point formats: 16-bit (signed) floating-point values, and 10- and 11-bit unsigned floating-point values Table J-1 describes the bit-layout of each representation, and the associated pixel formats Associated Pixel Formats 16-bit GL_RGB16F, GL_RGBA16F 10 11-bit GL_R11F_G11F_B10F (red and green components) 10-bit GL_R11F_G11F_B10F (blue component) 5 Table J-1 Sign bit Number of Exponents Bits Number of Mantissa Bits Floatingpoint Type Reduced-Precision Floating-Point Formats 16-bit Floating-Point Values For signed 16-bit floating-point values, the minimum and maximum values that can be represented are (about) 6.103u10-5, and 65504.0, respectively The following routine, F32toF16(), will convert a single, full-precision 32-bit floating-point value to a 16-bit reduced-precision form (stored as an unsigned-short integer) #define F16_EXPONENT_BITS 0x1F #define F16_EXPONENT_SHIFT 10 #define F16_EXPONENT_BIAS 15 #define F16_MANTISSA_BITS 0x3ff #define F16_MANTISSA_SHIFT (23 - F16_EXPONENT_SHIFT) #define F16_MAX_EXPONENT \ (F16_EXPONENT_BITS