18 Lights và Shadows

18 Lights và Shadows

http://www.opengl.org/resources/faq/technical/lights.htm

18.010 What should I know about lighting in general? 18,010 Tôi nên biết gì về ánh sáng nói chung?

You must specify normals along with your geometry, or you must generate them automatically with evaluators, in order for lighting to work as expected. Bạn phải chỉ định normals cùng với hình học của bạn, hoặc bạn phải tạo cho họ tự động với thẩm định, để cho ánh sáng để làm việc như mong đợi. This is covered in question 18.020 . Điều này được bao phủ trong câu hỏi 18,020.

Lighting does not work with the current color as set by glColor*(). Ánh sáng không làm việc với màu hiện tại là do glColor * (). It works with material colors. Set the material colors with glMaterial*(). Nó hoạt động với màu sắc vật liệu. Đặt màu sắc vật liệu với glMaterial * (). Material colors can be made to track the current color with the color material feature. Chất liệu màu sắc có thể được thực hiện để theo dõi những màu sắc hiện tại với những tính năng vật chất màu. To use color material, call glEnable(GL_COLOR_MATERIAL). By default, this causes ambient and diffuse material colors to track the current color. Để sử dụng vật liệu màu sắc, gọi glEnable (GL_COLOR_MATERIAL) Theo mặc định, điều này gây ra xung quanh và màu sắc vật liệu khuếch tán. Để theo dõi những màu sắc hiện tại. You can specify which material color tracks the current color with a call to glColorMaterial(). Bạn có thể xác định những tài liệu theo dõi màu sắc màu hiện tại với một cuộc gọi đến glColorMaterial ().

Changing the material colors with color material and glColor*() calls may be more efficient than using glMaterial*(). Thay đổi màu sắc vật chất với chất liệu màu sắc và glColor * () các cuộc gọi có thể được hiệu quả hơn bằng cách sử dụng glMaterial * (). See question 18.080 for more information. Xem câu hỏi 18,080 cho biết thêm thông tin.

Lighting is computed at each vertex (and interpolated across the primitive, when glShadeModel() is set to GL_SMOOTH). Ánh sáng được tính ở mỗi đỉnh (và suy trên nguyên thủy, khi glShadeModel () được thiết lập để GL_SMOOTH). This may cause primitives to appear too dark, even though a light is centered over the primitive. Điều này có thể gây ra nguyên thủy để xuất hiện quá tối, ngay cả khi ánh sáng là trung tâm trong nguyên thủy. You can obtain more correct lighting with a higher surface approximation, or by using light maps . Bạn có thể thu được nhiều ánh sáng đúng với một xấp xỉ bề mặt cao hơn, hoặc bằng cách sử dụng bản đồ ánh sáng.

A light’s position is transformed by the current ModelView matrix at the time the position is specified with a call to glLight*(). Một vị trí của ánh sáng là chuyển theo ma trận ModelView hiện tại thời vị trí được xác định với một cuộc gọi đến glLight * (). This is analogous to how geometric vertices are transformed by the current ModelView matrix when they are specified with a call to glVertex*(). For more information on positioning your light source, see question 18.050 . Điều này tương tự như thế nào đỉnh hình học được chuyển bằng ma trận ModelView hiện khi họ được quy định với một cuộc gọi đến glVertex * (). Để biết thêm thông tin về vị trí nguồn sáng của bạn, xem câu hỏi 18,050.

18.020 Why are my objects all one flat color and not shaded and illuminated? 18,020 Tại sao tất cả các đối tượng của tôi một căn hộ màu sắc và không bóng mờ và được chiếu sáng?

This effect occurs when you fail to supply a normal at each vertex. Hiệu ứng này xảy ra khi bạn không cung cấp một bình thường ở mỗi đỉnh.

OpenGL needs normals to calculate lighting equations, and it won’t calculate normals for you (with the exception of evaluators). OpenGL nhu cầu normals để tính toán phương trình chiếu sáng, và nó sẽ không tính toán normals cho bạn (ngoại trừ thẩm định). If your application doesn’t call glNormal*(), then it uses the default normal of (0.0, 0.0, 1.0) at every vertex. Nếu ứng dụng của bạn không gọi glNormal * (), sau đó nó sử dụng mặc định bình thường (0.0, 0.0, 1,0) tại mỗi đỉnh. OpenGL will then compute the same, or nearly the same, lighting result at each vertex. OpenGL sau đó sẽ tính toán như nhau, hoặc gần giống nhau, kết quả chiếu sáng tại mỗi đỉnh. This will cause your model to look flat and lack shading. Điều này sẽ gây ra mô hình của bạn để tìm bằng phẳng và che thiếu.

The solution is to simply calculate the normals that need to be specified at any given vertex. Giải pháp là đơn giản là tính toán normals cần được quy định tại bất kỳ đỉnh nào. Then send them to OpenGL with a call to glNormal3f() just prior to specifying the vertex, which the normal is associated with. Sau đó gửi chúng đến OpenGL với một cuộc gọi đến glNormal3f () ngay trước khi xác định các đỉnh, mà thường được kết hợp với.

If you don’t know how to calculate a normal, in most cases you can do it simply with a vector cross product. Nếu bạn không biết làm thế nào để tính toán một bình thường, trong hầu hết trường hợp, bạn có thể làm nó đơn giản chỉ với một sản phẩm qua véc tơ. The OpenGL Programming Guide contains a small section explaining how to calculate normals. Các Hướng dẫn lập trình OpenGL chứa một phần nhỏ giải thích làm thế nào để tính toán normals. Also most basic 3D computer graphics books cover it, because it’s not OpenGL-specific. Cũng cơ bản nhất đồ họa 3D máy tính sách bìa nó, bởi vì nó không phải OpenGL-cụ thể.

18.030 How can I make OpenGL automatically calculate surface normals? 18,030 Làm thế nào tôi có thể làm cho OpenGL tự động tính toán normals mặt?

OpenGL won’t do this unless you’re using evaluators. OpenGL sẽ không làm điều này, trừ khi bạn đang sử dụng thẩm định.

18.040 Why do I get only flat shading when I light my model? 18,040 Tại sao tôi chỉ che bằng phẳng khi tôi ánh sáng mô hình của tôi?

First, check the obvious. Trước tiên, hãy kiểm tra rõ ràng. glShadeModel() should be set to GL_SMOOTH, which is the default value, so if you haven’t called glShadeModel() at all, it’s probably already set to GL_SMOOTH, and something else is wrong. glShadeModel () phải được thiết lập để GL_SMOOTH, đó là giá trị mặc định, vậy nếu bạn không gọi là glShadeModel () ở tất cả, nó có thể đã thiết lập để GL_SMOOTH, và cái gì khác là sai.

If glShadeModel() is set correctly, the problem is probably with your surface normals. Nếu glShadeModel () được đặt đúng, vấn đề là có lẽ với normals bề mặt của bạn. To achieve a smooth shading effect, generally you need to specify a different normal at each vertex. Để đạt được một hiệu ứng che trơn, nói chung là bạn cần phải xác định một bình thường khác nhau ở mỗi đỉnh. If you have set the same normal at each vertex, the result, in most cases, will be a flatly shaded primitive. Nếu bạn đã cài cùng một lúc bình thường mỗi đỉnh, kết quả, trong hầu hết trường hợp, sẽ là một flatly bóng mờ nguyên thủy.

Keep in mind that a typical surface normal is perpendicular to the surface that you’re attempting to approximate. Hãy nhớ rằng một bề mặt điển hình bình thường là vuông góc với bề mặt mà bạn đang cố gắng gần đúng.

This scenario can be tough to debug, especially for large models. Kịch bản này có thể được khó khăn để gỡ lỗi, đặc biệt là đối với các mô hình lớn. The best debugging approach is to write a small test program that draws only one primitive, and try to reproduce the problem. Phương pháp gỡ lỗi tốt nhất là viết một chương trình thử nghiệm nhỏ rút ra rằng chỉ có một nguyên thủy, và thử để tạo lại vấn đề. It’s usually easy to use a debugger to isolate and fix a small program, which reproduces the problem. Nó thường dễ sử dụng một trình gỡ lỗi để cô lập và sửa chữa một chương trình nhỏ, mà tái tạo vấn đề.

18.050 How can I make my light move or not move and control the light position? 18,050 Làm thế nào tôi có thể làm cho di chuyển ánh sáng của tôi hay không di chuyển và kiểm soát các vị trí ánh sáng?

First, you must understand how the light position is transformed by OpenGL. Trước tiên, bạn phải hiểu thế nào vị trí ánh sáng là chuyển bởi OpenGL.

The light position is transformed by the contents of the current top of the ModelView matrix stack when you specify the light position with a call to glLightfv(GL_LIGHT_POSITION,…). If you later change the ModelView matrix, such as when the view changes for the next frame, the light position isn’t automatically retransformed by the new contents of the ModelView matrix. Các vị trí ánh sáng là chuyển bởi các nội dung của trang hiện hành của ma trận ModelView stack khi bạn xác định vị trí ánh sáng với một cuộc gọi đến glLightfv (GL_LIGHT_POSITION, …). Nếu bạn sau này thay đổi ma trận ModelView, chẳng hạn như khi xem những thay đổi cho Khung kế tiếp, vị trí ánh sáng không phải là tự động retransformed bởi các nội dung mới của ma trận ModelView. If you want to update the light’s position, you must again specify the light position with a call to glLightfv(GL_LIGHT_POSITION,…). Nếu bạn muốn cập nhật vị trí của ánh sáng, bạn lại phải xác định vị trí ánh sáng với một cuộc gọi đến glLightfv (GL_LIGHT_POSITION, …).

Asking the question “how do I make my light move” or “how do I make my light stay still” usually doesn’t provide enough information to answer the question. Hỏi những câu hỏi “làm thế nào để tôi thực hiện di chuyển ánh sáng của tôi” hoặc “làm thế nào để làm cho ánh sáng của tôi vẫn còn ở lại” thường không cung cấp đủ thông tin để trả lời câu hỏi. For a better answer, you need to be more specific. Here are some more specific questions, and their answers: Để có một câu trả lời tốt hơn, bạn cần phải được cụ thể hơn đây là một số câu hỏi cụ thể hơn,. Và trả lời của họ:

  • How can I make my light position stay fixed relative to my eye position? Làm thế nào tôi có thể làm cho ánh sáng của tôi ở vị trí cố định tương đối với vị trí mắt của tôi? How do I make a headlight? Làm thế nào để thực hiện một pha?

You need to specify your light in eye coordinate space. Bạn cần xác định ánh sáng của bạn trong mắt phối hợp không gian. To do so, set the ModelView matrix to the identity, then specify your light position. Để làm như vậy, thiết lập ma trận ModelView để nhận dạng, sau đó xác định vị trí ánh sáng của bạn. To make a headlight (a light that appears to be positioned at or near the eye and shining along the line of sight), set the ModelView to the identity, set the light position at (or near) the origin, and set the direction to the negative Z axis. Để thực hiện một pha (một ánh sáng xuất hiện để được vị trí tại hoặc gần mắt và chiếu theo hướng nhìn), thiết lập ModelView để nhận dạng các, thiết lập vị trí ánh sáng tại (hoặc gần nguồn gốc), và đặt hướng tới Z trục tiêu cực.

When a light’s position is fixed relative to the eye, you don’t need to respecify the light position for every frame. Khi vị trí của một ánh sáng là cố định tương đối với mắt, bạn không cần phải respecify vị trí ánh sáng cho mỗi khung. Typically, you specify it once when your program initializes. Thông thường, bạn chỉ định nó một lần khi chương trình của bạn khởi.

  • How can I make my light stay fixed relative to my scene? Làm thế nào tôi có thể làm cho ánh sáng của tôi ở lại cố định liên quan đến cảnh của tôi? How can I put a light in the corner and make it stay there while I change my view? Làm thế nào tôi có thể đặt một ánh sáng trong góc và làm cho nó ở lại đó trong khi tôi thay đổi xem tôi?

As your view changes, your ModelView matrix also changes. Khi thay đổi của bạn xem, ModelView ma trận của bạn cũng thay đổi. This means you’ll need to respecify the light position, usually at the start of every frame. A typical application will display a frame with the following pseudocode: Điều này có nghĩa là bạn sẽ cần phải respecify vị trí ánh sáng, thường là ở đầu mỗi khung. Một ứng dụng điển hình sẽ hiển thị một khung với giả sau đây:

Set the view transform. Set the light position //glLightfv(GL_LIGHT_POSITION,…) Send down the scene or model geometry. Swap buffers.

If your light source is part of a light fixture, you also may need to specify a modeling transform, so the light position is in the same location as the surrounding fixture geometry. Nếu nguồn ánh sáng của bạn là một phần của một vật cố ánh sáng, bạn cũng có thể cần phải xác định một mô hình biến đổi, do đó, vị trí ánh sáng là trong cùng một vị trí như là hình học vật cố xung quanh.

  • How can I make a light that moves around in a scene? Làm thế nào tôi có thể làm cho một ánh sáng mà di chuyển xung quanh trong một cảnh?

Again, you’ll need to respecify this light position every time the view changes. Một lần nữa, bạn sẽ cần phải respecify vị trí này ánh sáng mỗi khi thay đổi xem. Additionally, this light has a dynamic modeling transform that also needs to be in the ModelView matrix before you specify the light position. Ngoài ra, ánh sáng này có một mô hình năng động, biến đổi đó cũng cần phải được trong ma trận ModelView trước khi bạn xác định vị trí ánh sáng. In pseudocode, you need to do something like: Trong giả, bạn cần phải làm một cái gì đó như:

Set the view transform Push the matrix stack Set the model transform to update the light's position Set the light position //glLightfv(GL_LIGHT_POSITION,…) Pop the matrix stack Send down the scene or model geometry Swap buffers.

18.060 How can I make a spotlight work? 18,060 Làm thế nào tôi có thể làm cho một công việc spotlight?

A spotlight is simply a point light source with a small light cone radius. Spotlight đơn giản chỉ là một điểm sáng nguồn với bán kính hình nón ánh sáng nhỏ. Alternatively, a point light is just a spot light with a 180 degree radius light cone. Ngoài ra, một điểm sáng chỉ là một ánh sáng tại chỗ với một hình nón ánh sáng 180 độ bán kính. Set the radius of the light cone by changing the cutoff parameter of the light: Đặt bán kính của hình nón ánh sáng bằng cách thay đổi các tham số cắt của ánh sáng:

glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 15.f);

The above call sets the light cone radius to 15 degrees for light 1. Cuộc gọi trên bộ bán kính hình nón ánh sáng đến 15 độ cho ánh sáng 1. The light cone’s total spread will be 30 degrees. Lây lan tổng số nón ánh sáng sẽ được 30 độ.

A spotlight’s position and direction are set as for any normal light. Spotlight của một vị trí và hướng được đặt làm cho bất kỳ ánh sáng bình thường.

18.070 How can I create more lights than GL_MAX_LIGHTS? 18,070 Làm thế nào tôi có thể tạo đèn hơn GL_MAX_LIGHTS?

First, make sure you really need more than OpenGL provides. Trước tiên, hãy đảm bảo bạn thực sự cần nhiều hơn OpenGL cung cấp. For example, when rendering a street scene at night with many buildings and streetlights, you need to ask yourself: Does every building need to be illuminated by every single streetlight? Ví dụ, khi rendering một cảnh đường phố vào ban đêm với nhiều tòa nhà và đèn đường, bạn cần phải tự hỏi mình: Liệu mọi tòa nhà cần phải được chiếu sáng bởi mỗi Streetlight không? When light attenuation and direction are accounted for, you may find that any given piece of geometry in your scene is only illuminated by a small handful of lights. Khi ánh sáng sự mong manh và hướng đang chiếm, bạn có thể thấy rằng bất kỳ cho trước của hình học trong cảnh của bạn chỉ được chiếu sáng bởi một số ít nhỏ của đèn.

If this is the case, you need to reuse or cycle the available OpenGL lights as you render your scene. Nếu đây là trường hợp, bạn cần phải sử dụng lại hoặc chu kỳ đèn OpenGL có sẵn khi bạn render cảnh của bạn.

The GLUT distribution comes with a small example that might be informative to you. Phân phối thị trường bất động đi kèm với một ví dụ nhỏ mà có thể được cung cấp thông tin cho bạn. It’s called multilight.c. Nó được gọi là multilight.c.

If you really need to have a single piece of geometry lit by more lights than OpenGL provides, you’ll need to simulate the effect somehow. Nếu bạn thực sự cần phải có một mảnh duy nhất của hình học ánh sáng của đèn trên OpenGL cung cấp, bạn sẽ cần để mô phỏng hiệu ứng nào đó. One way is to calculate the lighting for some or all the lights. Một cách là để tính toán chiếu sáng cho một số hoặc tất cả các đèn. Another method is to use texture maps to simulate lighting effects. Phương pháp khác là sử dụng bản đồ cấu trúc để mô phỏng hiệu ứng ánh sáng.

18.080 Which is faster: making glMaterial*() calls or using glColorMaterial()? 18,080 nào là nhanh hơn: làm glMaterial * () các cuộc gọi hoặc sử dụng glColorMaterial ()?

Within a glBegin()/glEnd() pair, on most OpenGL implementations, a call to glColor3f() generally is faster than a call to glMaterialfv(). Trong vòng một glBegin () / glEnd () cặp, trên phần lớn OpenGL hiện thực, một cuộc gọi đến glColor3f () nói chung là nhanh hơn một cuộc gọi đến glMaterialfv (). This is simply because most implementations tune glColor3f(), and processing a material change can be complex and difficult to optimize. Điều này chỉ đơn giản là bởi vì hầu hết các triển khai điều chỉnh glColor3f (), và chế biến một sự thay đổi vật liệu có thể phức tạp và khó khăn để tối ưu hóa. For this reason, glColorMaterial() generally is recognized as the most efficient way to change an object’s material color. Vì lý do này, glColorMaterial () thường được công nhận là cách hiệu quả nhất để thay đổi màu sắc vật chất của một đối tượng.

18.090 Why is the lighting incorrect after I scale my scene to change its size? 18,090 Tại sao là ánh sáng không chính xác sau khi quy mô cảnh của tôi để thay đổi kích cỡ của nó?

The OpenGL specification needs normals to be unit length to achieve typical lighting results. Các đặc điểm kỹ thuật OpenGL nhu cầu normals được đơn vị chiều dài để đạt được kết quả ánh sáng điển hình. The current ModelView matrix transforms normals. Các ModelView hiện ma trận biến đổi normals. If that matrix contains a scale transformation, transformed normals might not be unit length, resulting in undesirable lighting problems. Nếu ma trận có chứa một chuyển đổi quy mô, normals đổi có thể không được đơn vị chiều dài, dẫn đến những vấn đề ánh sáng không mong muốn.

OpenGL 1.1 lets you call glEnable(GL_NORMALIZE), which will make all normals unit length after they’re transformed. OpenGL 1,1 cho phép bạn gọi glEnable (GL_NORMALIZE), điều này sẽ làm cho tất cả các đơn vị chiều dài normals sau khi họ đang chuyển. This is often implemented with a square root and can be expensive for geometry limited applications. Điều này thường được thực hiện với một căn bậc và có thể tốn kém cho các ứng dụng hình học hạn chế.

Another solution, available in OpenGL 1.2 (and as an extension to many 1.1 implementations), is glEnable(GL_RESCALE_NORMAL). Rather than making normals unit length by computing a square root, GL_RESCALE_NORMAL multiplies the transformed normal by a scale factor. Một giải pháp, có mặt tại OpenGL 1,2 (và như là một phần mở rộng để triển khai nhiều 1,1), là glEnable (GL_RESCALE_NORMAL). Thay vì làm normals đơn vị chiều dài của máy tính một căn bậc, GL_RESCALE_NORMAL multiplies bình thường chuyển bởi một yếu tố quy mô. If the original normals are unit length, and the ModelView matrix contains uniform scaling, this multiplication will restore the normals to unit length. Nếu normals ban đầu là đơn vị chiều dài, và ma trận ModelView chứa rộng thống nhất, điều này sẽ lại cho phép nhân normals theo chiều dài đơn vị.

If the ModelView matrix contains nonuniform scaling, GL_NORMALIZE is the preferred solution. Nếu ma trận ModelView chứa rộng nonuniform, GL_NORMALIZE là giải pháp ưa thích.

18.100 After I turn on lighting, everything is lit. 18,100 Sau khi tôi bật đèn, mọi thứ được thắp sáng. How can I light only some of the objects? Làm thế nào tôi có thể ánh sáng chỉ một số các đối tượng?

Remember that OpenGL is a state machine. You’ll need to do something like this: Hãy nhớ rằng OpenGL là một máy nhà nước. Bạn sẽ cần phải làm điều gì đó như thế này:

glEnable(GL_LIGHTING); // Render lit geometry. glDisable(GL_LIGHTING); // Render non-lit geometry.

18.110 How can I use light maps (eg, Quake-style) in OpenGL? 18,110 Làm thế nào tôi có thể sử dụng bản đồ ánh sáng (ví dụ, Quake-style) trong OpenGL?

See this question in the Texture Mapping section. Xem câu hỏi này trong phần Texture Mapping.

18.120 How can I achieve a refraction lighting effect? 18,120 Làm thế nào tôi có thể đạt được một hiệu ứng ánh sáng khúc xạ?

First, consider whether OpenGL is the right API for you. Trước tiên, hãy xem xét cho dù là OpenGL API phù hợp với bạn. You might need to use a ray tracer to achieve complex light affects such as refraction. Bạn có thể cần phải sử dụng một Tracer ray để đạt được ánh sáng phức tạp ảnh hưởng đến như khúc xạ.

If you’re certain that you want to use OpenGL, you need to keep in mind that OpenGL doesn’t provide functionality to produce a refraction effect. Nếu bạn chắc chắn rằng bạn muốn sử dụng OpenGL, bạn cần phải ghi nhớ rằng OpenGL không cung cấp chức năng để tạo ra một hiệu ứng khúc xạ. You’ll need to fake it. Bạn sẽ cần phải giả nó. The most likely solution is to calculate an image corresponding to the refracted rendering, and texture map it onto the surface of the primitive that’s refracting the light. Các giải pháp rất có thể là để tính toán một hình ảnh tương ứng với rendering khúc xạ, và kết cấu bản đồ nó lên bề mặt của nguyên thủy đó là refracting ánh sáng.

18.130 How can I render caustics? 18,130 Làm thế nào tôi có thể khiến caustics?

OpenGL can’t help you render caustics, except for texture mapping. OpenGL không thể giúp bạn render caustics, ngoại trừ kết cấu bản đồ. GLUT 3.7 comes with some demos that show you how to achieve caustic lighting effects. Thị trường bất động 3,7 đi kèm với một số bản demo mà bạn thấy làm thế nào để đạt được hiệu ứng ánh sáng ăn da.

18.140 How can I add shadows to my scene? 18,140 Làm thế nào tôi có thể thêm vào bóng tối để cảnh của tôi?

OpenGL does not support shadow rendering directly. OpenGL không hỗ trợ trực tiếp bóng rendering. However, any standard algorithm for rendering shadows can be used in OpenGL. Tuy nhiên, bất kỳ thuật toán tiêu chuẩn cho rendering bóng có thể được sử dụng trong OpenGL. Some algorithms are described at http://www.opengl.org . Một số thuật toán được mô tả ở http://www.opengl.org. Follow the Coding Tutorials & Techniques link, then the Rendering Techniques link. Hướng dẫn thực hiện theo các liên kết mã & Kỹ thuật, sau đó Rendering Kỹ thuật liên kết. Scroll down to the Lighting, Shadows, & Reflections section. Cuộn xuống Ánh sáng, Shadows, & phần Reflections.

The GLUT 3.7 distribution comes with examples that demonstrate how to do this using projection shadows and the stencil buffer. Các thị trường bất động 3,7 phân phối đi kèm với các ví dụ đó chứng minh làm thế nào để làm điều này bằng cách sử dụng bóng chiếu và bộ đệm stencil.

Projection shadows are ideal if your shadow is only to lie on a planar object. Bóng chiếu bóng là lý tưởng nếu bạn chỉ để nằm trên một đối tượng phẳng. You can generate geometry of the shadow using glFrustum() to transform the object onto the projection plane. Bạn có thể tạo ra hình học của bóng tối bằng cách sử dụng glFrustum () để biến đổi đối tượng lên mặt phẳng chiếu.

Stencil buffer shadowing is more flexible, allowing shadows to lie on any object, planar or otherwise. The basic algorithm is to calculate a “shadow volume”. Cull the back faces of the shadow volume and render the front faces into the stencil buffer, inverting the stencil values. Then render the shadow volume a second time, culling front faces and rendering the back faces into the stencil buffer, again inverting the stencil value. Stencil đệm shadowing là linh hoạt hơn, cho phép bóng tối để nằm trên bất kỳ đối tượng, phẳng hoặc bằng cách khác. Thuật toán cơ bản là để tính toán một khối lượng bóng tối “”. Cull trở lại khuôn mặt của khối lượng bóng và đưa ra phía trước đối mặt vào bộ đệm stencil, inverting các giá trị stencil. Sau đó, khiến khối lượng bóng lần thứ hai, tiêu huỷ phải đối mặt trước và mặt sau rendering khuôn mặt vào trong bộ đệm stencil, một lần nữa inverting giá trị stencil. The result is that the stencil planes will now contain non-zero values where the shadow should be rendered. Kết quả là những chiếc máy bay stencil bây giờ sẽ chứa các giá trị khác không có bóng tối nên được trả lại. Render the scene a second time with only ambient light enabled and glDepthFunc() set to GL_EQUAL. The result is a rendered shadow. Render cảnh lần thứ hai với ánh sáng xung quanh chỉ được kích hoạt và glDepthFunc () thiết lập để GL_EQUAL Kết quả là một bóng rendered..

Another mechanism for rendering shadows is outlined in the SIGGRAPH ’92 paper Fast Shadows and Lighting Effects Using Texture Mapping , Mark Segal et al. Một cơ chế rendering bóng được nêu trong các SIGGRAPH ’92 giấy nhanh Shadows và Lighting Effects Texture Sử dụng bản đồ, Mark Segal et al. This paper describes a relatively simple extension to OpenGL for using the depth buffer as a shadow texture map. Both the GL_EXT_depth_texture and the GL_EXT_texture3D (or OpenGL 1.2) extensions are required to use this method. Bài báo này mô tả một phần mở rộng tương đối đơn giản để OpenGL để sử dụng bộ đệm chiều sâu như là một bản đồ bề mặt bóng Cả hai GL_EXT_depth_texture và. Các GL_EXT_texture3D (hoặc OpenGL 1,2) phần mở rộng được yêu cầu sử dụng phương pháp này.

Về vdhungbg
Tin tuc cap nhat - moi luc - moi noi

Gửi phản hồi

Please log in using one of these methods to post your comment:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: