• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
Kepakiano

SSBO vs. Texture

2 posts in this topic

Hey there,

 

I am writing a fragment shader, which needs two float values with some additional information for every fragment it calculates. These values will be calculated at the beginning of the program and won't change any time, so they could be stored in a 2D or 1D lookup table/array.

 

My first two choices for this would be:

1. rendering the values in a separate fragment shader to a 2D GL_RG32F texture or

2. calculating the values in a compute shader and store them in a vec2 array in a shader storage buffer object (the size of table is not known at compile time!).

 

What is the best/fastest way to store them and look them up? Is there another fast method?

 

Thank you for your help.

0

Share this post


Link to post
Share on other sites

There is a long term trend in GPUs for calculation to become faster relative to texture lookups and GPU programmers often use lookup tables unnecessarily as an optimisation technique (don't take my word for it http://diaryofagraphicsprogrammer.blogspot.co.uk/2011/07/no-look-up-tables-rules-for-designing.html).

 

Of course, it all depends on your exact situation, but are you sure that it is worth precalculating and storing the values at all rather than just calculating them on the fly per fragment?

 

I'm afraid that if you do store a lookup table, then I don't know which is the better option, my hunch would be a texture, but that's not much more than a guess.

1

Share this post


Link to post
Share on other sites

needs two float values with some additional information for every fragment

If this means "two float values (and something else, blah blah)", then the best way is to compute the two values on the CPU and set them as uniforms. Use an UBO if you will.

If this means "two float values that depend on something else which varies for every fragment" then the best way remains a lookup texture, for two reasons: First, SSBO has functionality that you do not need (writeable, atomic ops, etc.). Second, SSBO is not yet widely supported (not everyone has latest-generation hardware!). Which means by using SSBO, you lock out potential customers for a reason that doesn't make sense to you.

Note that an uniform buffer object will (assuming it's not huge) likely be in dedicated read-only memory on some architectures (e.g. Kepler), which is equivalent to being permanently in L1 cache without using up L1 cache.
1

Share this post


Link to post
Share on other sites

Thank you for your answers.

 

"Of course, it all depends on your exact situation, but are you sure that it is worth precalculating and storing the values at all rather than just calculating them on the fly per fragment?"

 

My 'boss' asked the same question :D

 

Okay, this is what I'm doing: http://pastebin.com/YXP6j9vN

Short description: "grid" defines a distorted 2D grid of points like this one:

(-1.0 1.0) (0.0 1.0) (1.0 1.0)
(-1.0 0.0) (-0.2 0.0) (1.0 0.0)
(-1.0 -1.0) (0.0 -1.0) (1.0 -1.0)

Note: These four quads are not enough, I need at least 16x16, maybe even 24x24 or 32x32.

So, for every fragment, I need to find out in which one of the quads the current fragment lies (lines 88 - 105, pretty naive implementation with linear complexity) by dividing the current quad into two triangles and calculating the point's barycentric coordinates in this triangle (lines 19 - 30). If the correct quad is found, the point will be bilinearly interpolated and the value will be returned.

The resulting vec2 is what I want to store for every fragment.

 

I'm pretty sure a texture/SSBO lookup would be faster than 1-16 (assuming I come up with a faster way to find the correct quad) point-in-triangle checks and one bilinear interpolation, but I have no experience in that matter. What do you think?

 

@samoth: The second is the case. I chose the SSBO, because of its ability to store arrays of arbitrary length, which would be nice. My target platform (a virtual reality lab) fully supports OpenGL 4.3 :) But you are probably right: The drawbacks outweigh the benefits compared to a texture.

 

The lab's projectors have a resolution of 1400x1050 pixels, so the buffer would need 1400*1050*8 Bytes (two floats per pixel) = 11,760,000 Bytes = 11.21 MiB of space which is probably too much for the L1 cache of a GTX 460 :/

 

So, (assuming I really precalculate) you think I should go for a texture?

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0