Jump to content
  • Advertisement
  • Features

    1. Past hour
    2. 8Observer8

      Can only create games with game engines.

      A few years ago I created this 3D game without engines: https://www.gamedev.net/projects/1049-bitballoon3d/ I used pure WebGL and TypeScript for this game. The author of TypeScript is Anders Hejlsberg. He is also the author of C#. I see that you study C#. You wrote about it above and you tagged your theme with C#. TypeScript and C# are very similar languages. I like study these languages together. I can use OpenGL/OpenTK for C# and WebGL for TypeScript. This way saves my time because OpenGL and WebGL are similar. I like to study similar things. TypeScript and WebGL allow us to run applications in one click in different platforms. For example, you work on Windows and you make a demo. You want to show your demo to your friend but he uses Mac. You can spend a lot of time to build your demo to Mac and Linux from Windows. If you made your simple game using WebGL you can give a link to your friends and they can run it even on mobile devices. One click only. Your can share your code with friend and make your games in Sandbox. I made this Snake 2.5 game using TypeScript and WebGL. You can fork it (just press Fork button in Plunker), change and send me a link on your version with your changes. This way helps to study coding.
    3. Could you edit your post and put the code in code tags? That will make it easier to read. (Obviously there's not much code there and I'm sure someone could diagnose the problem as it is currently, but it would be easier with proper formatting.)
    4. Regarding this part: Another possible reason besides performance would be portability. For example, C++ might be a reasonable choice for a common code base shared between e.g. iOS and Android versions of a game or framework. Further, it seems like whether performance would be a concern at all would depend on e.g. what platforms you're targeting and what types of projects you're working on. Depending on the answers to those questions, other languages might be perfectly suitable. I could be wrong about this, but I've always been under the impression that the motivators behind ECSs are mostly architectural and not as much related to performance. Obviously an ECS implementation can be performant, but such a system could certainly be implemented in a non-performant way as well. So if your primary motivation for using an ESC is performance and not, say, convenience or architecture, it seems like that might be worth taking another look at.
    5. RoKabium Games

      ScreenShotSaturday

      Keeping up with the twitter hashtag of screen shots on Saturday!
    6. You are right. Runtime composition shouldn't be the default solution. Using your language features for compile time composition is good enough most of the time, especially for smaller projects. ECS is not the magical silver bullet people claim it to be, nor is it the only solution out there.
    7. Today
    8. Ah the Assembly part was quite demanding and made simple demos( drawing a line, in realtime, was a challenge ) for the Spectrum. To be honest, I managed basic stuff but it proved invaluable to understanding the Mastersystem and Megadrive. It also helps clear up myths from their eras such as "the Snes was more powerful than the MD, and so on for the Spectrum and C64", as in neither case was that correct. For every advantage one had, it was trumped in another. My time with C++ and DirectX was..."messy". I was learning in 2000 and my knowledge was like Frankenstein's monster - different books and winging it on hope-and-a-prayer. In that hindsight I do recommend, once or twice a week, to spend a 30 minute focused session reviewing your code and slim'n'tidy it, ready for your longer, more serious sessions. This is what really shapes you into a disciplined programmer and to also nuture your own style. Basically, get into a routine.... I think you're on the right track, though!
    9. MasterReDWinD

      Compute shader return values

      Many thanks for your reply Valakor. I've had a go at getting this working. This is what I have so far: void CornerPoints(float x, float y, float z, out int corners[8*3]) { ... corners = { // Front x0, y0, z0, // front bottom left x0, y1, z0, // front top left x1, y1, z0, // front top right x1, y0, z0, // front bottom right // Rear x0, y0, z1, // rear bottom left x0, y1, z1, // rear top left x1, y1, z1, // rear top right x1, y0, z1 // rear bottom right }; In the calling function I have: int corners[8 * 3]; CornerPoints(x, y, z, out corners); Unfortunately I'm getting a couple of errors: Shader error in 'VoxelShaderTest.compute': syntax error: unexpected token '{' at kernel CalculateMaterials at VoxelShaderTest.compute(124) (on d3d11) Shader error in 'VoxelShaderTest.compute': 'CornerPoints': no matching 0 parameter function at kernel CalculateMaterials at VoxelShaderTest.compute(144) (on d3d11) Shader error in 'VoxelShaderTest.compute': syntax error: unexpected token 'out' at kernel CalculateMaterials at VoxelShaderTest.compute(144) (on d3d11) Do you have any ideas on these? I think you're right on the array needing to be flattened.
    10. Magogan

      Questions about career

      Are those salaries real? Do people actually make $70,000 with under 3 years of experience as a game programmer? And where? If it's in San Francisco, $70k is not much. I heard for a family with 2 children, if you are earning less than $100k you can barely afford living in the Bay area for example.
    11. 8Observer8

      Can only create games with game engines.

      I like the Input system that described in this book: Learn Math for Game Developers
    12. mhykah

      DevBlog: Flying Fish #1

      Introduction The idea just came to me as I was day dreaming. A game where you play as a fish wanting to fly. It would be an endless runner where you hold down a key to dive, the deeper you dive the higher you jump through the sky. Avoid obstacles, collect bonus points, etc. Referencing other games, the best way I can explain it is something similar to Halfbrick's Jetpack Joyride. As a relative beginner without great equipment I think that this is a project with reasonable scope and is something I feel is achievable. Obstacles I foresee are (1) creating and tweaking acceleration to feel good and intuitive, and (2) level design/procedural generation. Addressing these: (1) I'd like to study Jetpack Joyride's movement as I remember it feeling just right, and see how this can apply to my game (2) I think that full level design is unfeasible and limiting. I plan to create 'modules' of obstacles and awards which can randomly appear one after the other. The modules which appear can be decided based on the player's current score. Current Progress Time taken: 1.5 hours Movement done but no acceleration
    13. 8Observer8

      Best software for a simple game

      I recommend you to study these video lectures: Math for Game Developers
    14. suliman

      Vehicles in FPS games

      Shade please cut it out. Im not trying to destroy someones life. Im simply pointing out that when you set out in this business, many people bite off more than they can chew (having overly ambitous projects when not realizing how much work is required), which leads to lots of disappointment and people giving up. I was certainly like that when I started making games in 2001. On topic: I would still recommend the OP to flesh out the core shooting first, as well as other critic components, such as networking if the game is multiplayer.
    15. Recently,I am studying bullet3 and DirectX 11.And I got some wired results like the attachments shows.It should be a sphere not a flat plane. I extended the btIDebugDraw to draw lines.The draw line api works correctly independently.And I traced the call stack and found there was some thing wrong with the bullet transform .I have no idea about how it acts like that. So I ask for help here.Any help or tips will be apreciated.
    16. It seems most of these game server browsers have died out since years. You can look there for more infos: https://en.wikipedia.org/wiki/Category:Game_server_browsers
    17. You recreate the array each frame, consider making a big array of sprites and not to use all of them, or if you have a constant num of sprites then you use glBufferSubData and you dont do glGenBuffers per frame too its only needed when you change the size of vertex buffer, anyway you gave no idea what ur doing
    18. I haven't fully read through your code or your github but: That code you posted for OpenGL ES2, is it meant to be pseudocode? There are no functions. It is not clear what you are doing as a once off process and what you are doing per frame. The general idea in graphics programming (and game programming in general) is usually to move as much code into a once off process (on starting game or level etc) and do as little as possible per frame. As such, to move a viewpoint, you typically don't change the vertex data, you might change, e.g. a matrix representing the view / camera transform and pass it as a uniform. This is very cheap to do for the GPU. If you do need to change dynamically vertex data each frame, you should explicitly tell the API that it is dynamic (rather than static unchanging) on creation. You have to be very careful using dynamic vertex buffers so as not to drastically affect performance by stalling the pipeline. In some cases this means creating e.g. 3 copies of a dynamic VB, and using them in turn on each frame. In some cases the API help do this for you, it is a good idea to try both and compare if you are not sure. You also absolutely do not want to be making any dynamic allocations / deallocations either on the GPU or CPU each frame.
    19. Zemlaynin

      DevBlog, No. 35

      Hello dears! This month we had the following tasks: 0. Decide whether we need to implement AO (ambient occlusion) or not. 1. Screw the optimization of the terrain, i.e. return it to the previous level. 2. Implement the creation of a settings file and its saving. 3. Loading textures depending on quality settings. 4. To implement the preloading of the objects. 5. Tie different mines, and implement a new type of buildings-career. 6. Do as I call them multiobjects. These are the objects on the map that will be drawn by several instancing objects. 7. Implement a window interface object that can be dragged and dropped. Including the second screen, respectively, to implement support for the second screen. 8. And finally to finish the creation of new cities with strata and the first economic ties. But after reading an interesting article https://gamedev.ru/industry/articles/Godot_making_game threw a number of tasks and the list turned out: 1. Screw the optimization of the terrain, i.e. return it to the previous level. 2. Implement the creation of a settings file and its saving. 3. Loading textures depending on quality settings. 4. Tie different mines, and implement a new type of buildings-career. 5. And finally to finish the creation of new cities with strata and the first economic ties. On the project as before continued to work at least 12 hours a day. But one day I forgot the flash drive at work with the project and did not do it at home... And after this, so to speak forced rest, the next day was productive. Decided to practice this approach to development. In the end the performance like, has increased, probably affected tiredness. As a result, I took a two-week break from development. Week vacation and a week was given to all the various accumulated personal and work events. After such rest the first week left on performance of the list of small tasks: - fixed a glitch with trees that appeared in the ice; - made snow Christmas trees; - corrected models of deciduous trees; - corrected generation of mountains, reduced height of peaks, reduced snow caps; - fixed a bug with square banks. - fixed new textures of mountains. - completed mapping of surfaces (swamps, ice) now they are clearly displayed according to the grid of 4x4 sub-tiles; - fixed pathfinding algorithm considering new mountains. The first of the main list were made mines and quarries: And we have one small miracle of the world: Next made loading textures depending on the selected quality, and had the same Tinker with this seemingly easy task. In General, I implemented 4 out of 5 main points. Again deprived gameplay. Today, with the engine stopped. It remains only to correct the generation of rivers. And all next month only gameplay on the agenda. Try Thank you for your attention!
    20. It is perfectly normal to struggle on this because it's new to you. I really cannot get into massive amounts of detail without writing an entire guide, but you'll want to break everything down into smaller and manageable steps but with purpose. Regarding input binding this is a very useful feature to have! You'll want to think as logical as possible and what makes sense for your overall design. Just a small example for you. If I have a game that moves the player using WASD and I want to change W to T in order to move forward I can do something like this: (I'm using SFML as an example but you can use anything that gives you access to keycodes) For my playerObject I just have a very simple class: class playerObject { public: // X - Y Position int x = 0; int y = 0; // Initial Keys sf::Keyboard::Key moveForwardKey = sf::Keyboard::Key::W; sf::Keyboard::Key moveBackwardKey = sf::Keyboard::Key::S; sf::Keyboard::Key moveLeftKey = sf::Keyboard::Key::A; sf::Keyboard::Key moveRightKey = sf::Keyboard::Key::D; // Setup starting position void setup(int tX, int tY) { x = tX; y = tY; } // Move by passed amount ( Up, Down, Left, Right) void moveForward(int tAmount) { y -= tAmount; } void moveBackward(int tAmount) { y += tAmount; } void moveLeft(int tAmount) { x -= tAmount; } void moveRight(int tAmount) { x += tAmount; } // Bind New Keys void bindMoveForwardKey(sf::Keyboard::Key tKeyCode) { moveForwardKey = tKeyCode; } void bindMoveBackwardKey(sf::Keyboard::Key tKeyCode) { moveBackwardKey = tKeyCode; } void bindMoveLeftKey(sf::Keyboard::Key tKeyCode) { moveLeftKey = tKeyCode; } void bindMoveRightKey(sf::Keyboard::Key tKeyCode) { moveRightKey = tKeyCode; } }; In your logic step you'll have something like this: // Move Block if (sf::Keyboard::isKeyPressed(greenBoxPlayer->moveForwardKey)) { greenBoxPlayer->moveForward(5); } if (sf::Keyboard::isKeyPressed(greenBoxPlayer->moveBackwardKey)) { greenBoxPlayer->moveBackward(5); } if (sf::Keyboard::isKeyPressed(greenBoxPlayer->moveLeftKey)) { greenBoxPlayer->moveLeft(5); } if (sf::Keyboard::isKeyPressed(greenBoxPlayer->moveRightKey)) { greenBoxPlayer->moveRight(5); } Notice how we're not checking for W to move up? We're checking if the keycode assigned to moveForwardKey is pressed and doing the action required, it doesn't matter if that keycode returns as O or P, if it is pressed it will call our moveForward function. You'll have to program a class to handle input binding. I simply made a class that works on 3 steps. You press F1 then Step 1 starts which waits for your to hit the first key: myKeyBinder.setKeySelectionOne(tSelectedKey); , then toggles Step 2. Step 2 waits for you to select the new key: myKeyBinder.setKeySelectionTwo(tSelectedKey); then applies the change like this: myKeyBinder.changeKeyBind(*greenBoxPlayer); which looks for the first selection to see if it is a set key to begin with, then if it is found, it will just swap it with your second selection. I know this is a pretty rough example, you'll most likely want to make controller classes which work with your player objects, and so forth. (GIF) - Key Swapping in Action:
    21. I think you misunderstood my question. I'm well aware of hosting options. -- I'm specifically trying to AVOID hosting my own service. This is like a common game thing that every game does that eats up like almost no CPU or bandwidth, so I'd be quite surprised if there really aren't any matchmaking services out there... I know Steam has one in their API that they host for you, but I have no idea how to get into the steam platform -- especially with a hobby game that I don't plan to sell on Steam. XD I could imagine writing one that was an IRC channel... but that would be super sketchy and hacky... I guess I'll probably just throw up a quick ASP.NET SignalR repeater on the Azure free tier. 🙄
    22. Hosting for your own code, or a complete services ? The cost for a micro Linux node in AWS, Azure, etc. is pretty low, should be well below $10 a month, and if it's just for server lobby/listing will be a while before scale is an issue. AWS will give you an EC2 instance and some other things free for a year. There are many other similar providers. A shared webhosting server may also work, but be a bit more restrictive. For initial development testing, you might just run the server on your own home network, possibly even on your own PC, maybe in a VM. Use something like Duck DNS if you don't have a static IP. Not sure on any free services / libraries. Steam provides some stuff in Steamworks, but I guess that is not what you are looking for and no idea about the other platforms.
    23. Did you profile? CPU or GPU bottleneck? The new code seems to do some extra things as well. `mvMatrix` is being made for each sprite and then stored in every vertex? That is a lot of data. Normally for rendering tiles, I'll just do the X/Y addition in the CPU code (directly, no matrix), then if the game say camera rotation/zooming and I need a matrix, I'll just have a single one for all world sprites in the entire frame (as a uniform). I also found doing the translation directly helps avoid FP rounding errors that can cause visible seams between adjacent tiles/sprites. Not sure what the cost of `glGenBuffers`, `glGenVertexArrays`, etc. is. The code I have here appears to re-use the same one, replacing the contents with `glBufferData`. I also believe STATIC is slower to "upload" than DYNAMIC or STREAM. What is `texAtlas.add(obj- >textureName);`. Your not rebuilding a texture dynamically are you? Even if not every frame, need to be careful not to cause slow frames / stutter. Also looks like a string, if its doing string map lookups for every sprite that is not ideal. Also not sure on the cost of things like `setVertexAttrib`. You should be able to do this once, and it is saved with the `GL_ARRAY_BUFFER` (possibly all in one go, e.g. `glVertexAttribPointer`) Any sort of dynamic branch in a shader is usually bad if adjacent/nearby data will branch differently. GPU cores are not like CPU ones and can't all independently do their own thing. I didn't look closely at your data, but something to be aware of. The "useTexture" path calls `texture2D` twice, I am not sure this will be optimised out. The `mvMatrix * vPosition` multiplication is done twice, again not sure it will optimise that. What is vTexSpan for? Seems like extra work. Likewise for the unused normals.
    24. I'm writing a silly open / free game in MonoGame, and I've got LAN broadcasting in for broadcasting open game lobbies that a player could join via local network; but I'd like to also support something similar via the internet. It's a simple client / server model action game using UDP, nothing super complicated going on. The library I'm using supports punching holes in NAT via UPNP so, that's not a big deal for me. -- I'm just wondering if there's any free services out there (maybe something with an HTTP based REST API) that I could use to post open games to, so that players could connect and join to them. (I don't mind writing my own and throwing it up in Azure but I'd rather not waste my time and money if there's something free out there.)
    25. I have used EnTT for a few half finished projects. I like it because, as a more intermediate programmer, it forced me into the pattern. Sort of like coding on rails a bit in a good way. Part of my feels that it is too much of a bother for most projects. Another part of me feels like that the ECS pattern is only going to get more common and that I should be concerned about data locality and speed no matter what (otherwise why am I even writing in C++?). I've honestly never had a project which needed the extra performance boost that an ECS library would give me. Usually my bottleneck is inefficient collision detection and noob rendering. Two parts of my mind are conflicting: one tells me that using a library is great because it lets me how things are supposed to be done, and that I should use a library of every type before I try to roll my own. Another part of my mind tells me that I will never fully learn this stuff without rolling my own and that I am wasting my time using a library when I can't even roll my own and don't know completely how it all works. Anyhow, let me know your thoughts and experiences with ECS libraries.
    26. Tom Sloper

      Questions about career

      1. The pay is reasonable if you have the right skill set. The pay is lousy if you work as a tester in QA. It's awesome if you work as a programmer. You didn't say which game job you aspire to. 2. Yes, it's competitive. It's not easy to get hired, unless you outshine the competition. The competition for you, 10 years from now, is "other college grads." (I'm saying you need to get a college degree.) 3. "Worth" is subjective. Only YOU can determine whether or not something is "worth it" for YOU. Salary link1: https://www.gameindustrycareerguide.com/video-game-programmer-salary/ Salary link2: https://www.jobmonkey.com/videogamejobs/video_game_design_compensation/ Salary link3: https://www.gamasutra.com/salarysurvey2014.pdf Getting hired: http://sloperama.com/advice/jobapp.htm Worth: http://sloperama.com/advice/route66.htm
    27. BrainSlugs83

      c# drawing sprites

      @kseh is correct. If you want to stop drawing something, then just stop drawing it. You do not need to ever draw a black sprite to Erase something, because you're clearing the window on the first line anyway. He's is also correct in noting that you should not be calling Invalidate in the paint function (that will cause the CPU usage to be very high, in my experience). -- You should instead be calling "this.Invalidate(true);" in your timer method (you do have to call it somewhere, or else the window won't repaint -- so you need to call it every tick). His logic also sounds correct for what you are describing. -- If you want something to happen for a bit, then start a counter, and only draw the thing you want to draw while that counter is in a given range of values, and then just stop drawing it after that.
    28. I'm getting some strangely unexpected results with my new sprite renderer that uses OpenGL ES 2.0. It performs much worse than my old sprite renderer from 5 years ago that uses OpenGL ES 1.1 (no shaders). All I'm doing is displaying a grid of quads 16x16 and moving and zooming it around a little bit. You can see the difference in the video below: Video to demonstrate the issue Clearly, the fixed pipeline runs smoothly, but my supposedly fast one-draw-call shader program chugs (when I tried one draw call-per-quad it was naturally even slower). This is not what I expected. How can I speed up my new sprite renderer? Is the fixed function pipeline naturally just more adapted to vertex data that changes more often? (like a new VBO on every frame) I could just re-write the new renderer in OpenGL ES 1.1 again, but then I will lose compatibility with desktop OpenGL. This is a bad idea, right? Can I emulate the fixed-function pipeline with shaders? Is there code out there that does this? What tricks did they use in it to get sprites to render so fast? Old Fixed-Function Code: for (int z = 0; z <= mTileEdit.mCurLevel; z++) { for (int y = 0; y < tm.mSizeY; y++) { for (int x = 0; x < tm.mSizeX; x++) { int t = tm.get(x, y, z); if (t != 0 && t > 0 && t < 256) { // Set alpha float alpha = 1.0f; if (Lozoware.getMP().get("name").equals("pixeledit") || Lozoware.getMP().get("name").equals("edit3d")) { alpha = 1.0f - ((float)z / (float)tm.mSizeZ); } // Set color gl.glColor4f(tm.mPalette.mRed[t], tm.mPalette.mGreen[t], tm.mPalette.mBlue[t], alpha); // Vertex buffer bb = ByteBuffer.allocateDirect((6 * 3) * 3 * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer buf = bb.asFloatBuffer(); float bottomLeftX = x * mGLTileSizeX; float bottomLeftY = y * mGLTileSizeY; float topLeftX = x * mGLTileSizeX; float topLeftY = y * mGLTileSizeY + mGLTileSizeY; float bottomRightX = x * mGLTileSizeX + mGLTileSizeX; float bottomRightY = y * mGLTileSizeY; float topRightX = x * mGLTileSizeX + mGLTileSizeX; float topRightY = y * mGLTileSizeY + mGLTileSizeY; buf.position(0); buf.put(topLeftX); buf.put(topLeftY); buf.put(0); buf.put(bottomRightX); buf.put(bottomRightY); buf.put(0); buf.put(bottomLeftX); buf.put(bottomLeftY); buf.put(0); buf.put(topLeftX); buf.put(topLeftY); buf.put(0); buf.put(topRightX); buf.put(topRightY); buf.put(0); buf.put(bottomRightX); buf.put(bottomRightY); buf.put(0); buf.position(0); // Draw gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buf); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6 * 3); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } } } } gl.glFlush(); New OpenGL ES 2.0 Code: int numVerts = 0; int numQuads = 0; // Alloc enough data for all sprites for (const auto & pair: objects) { Object * obj = pair.second; if (obj != nullptr && obj - > visible && obj - > type == OBJTYPE_SPRITE) { numVerts += 6; numQuads += 1; } } int floatsPerVert = 26; float * data = new float[numVerts * floatsPerVert]; int cursor = 0; // Quad/sprite index int q = 0; // Fill data for all sprites for (const auto & pair: objects) { Object * obj = pair.second; if (obj != nullptr && obj - > visible && obj - > type == OBJTYPE_SPRITE) { // Add sprite texAtlas.add(obj - > textureName); if (texAtlas.getNeedsRefresh()) texAtlas.refresh(); // Set modelview matrix glm::mat4 mvMatrix; glm::mat4 scaleToNDC; glm::mat4 cameraRotate; glm::mat4 cameraTranslate; glm::mat4 rotate; #ifdef PLATFORM_OPENVR scaleToNDC = glm::scale(glm::mat4(), glm::vec3(VRSCALE, VRSCALE, VRSCALE));# else scaleToNDC = glm::scale(glm::mat4(), glm::vec3(NDC_SCALE, NDC_SCALE, NDC_SCALE));# endif if (obj - > alwaysFacePlayer) rotate = glm::rotate(glm::mat4(), glm::radians(-camera - > yaw), glm::vec3(0, 1, 0)) // Model yaw * glm::rotate(glm::mat4(), glm::radians(camera - > pitch), glm::vec3(1, 0, 0)); // Model pitch else rotate = glm::rotate(glm::mat4(), glm::radians(-obj - > yaw), glm::vec3(0, 1, 0)) // Model yaw * glm::rotate(glm::mat4(), glm::radians(-obj - > pitch), glm::vec3(1, 0, 0)); // Model pitch cameraRotate = glm::rotate(glm::mat4(), glm::radians(camera - > roll), glm::vec3(0, 0, 1)) // Camera roll * glm::rotate(glm::mat4(), -glm::radians(camera - > pitch), glm::vec3(1, 0, 0)) // Camera pitch * glm::rotate(glm::mat4(), glm::radians(camera - > yaw), glm::vec3(0, 1, 0)); // Camera yaw cameraTranslate = glm::translate(glm::mat4(), glm::vec3(-camera - > position.x, -camera - > position.y, -camera - > position.z)); // Camera translate #ifdef PLATFORM_OPENVR mvMatrix = glm::make_mat4((const GLfloat * ) g_poseEyeMatrix.get()) * scaleToNDC * cameraRotate * cameraTranslate * glm::translate(glm::mat4(), glm::vec3(obj - > position.x, obj - > position.y, obj - > position.z)) // World translate * rotate * glm::scale(glm::mat4(), obj - > scale / glm::vec3(2.0, 2.0, 2.0)); // Scale #else mvMatrix = scaleToNDC * cameraRotate * cameraTranslate * glm::translate(glm::mat4(), glm::vec3(obj - > position.x, obj - > position.y, obj - > position.z)) // World translate * rotate * glm::scale(glm::mat4(), obj - > scale / glm::vec3(2.0, 2.0, 2.0)); // Scale #endif // ______ // |\\5 4| // |0\\ | // | \\ | // | \\ | // | \\3| // |1__2_\\| // Triangle 1 // Vertex 0 data[cursor + 0] = -1.0 f; data[cursor + 1] = 1.0 f; data[cursor + 2] = 0.0 f; data[cursor + 3] = 1.0 f; UV input; input.u = 0.0 f; input.v = 1.0 f; UV output = texAtlas.getUV(obj - > textureName, input); data[cursor + 4] = output.u; data[cursor + 5] = output.v; data[cursor + 6] = mvMatrix[0][0]; data[cursor + 7] = mvMatrix[0][1]; data[cursor + 8] = mvMatrix[0][2]; data[cursor + 9] = mvMatrix[0][3]; data[cursor + 10] = mvMatrix[1][0]; data[cursor + 11] = mvMatrix[1][1]; data[cursor + 12] = mvMatrix[1][2]; data[cursor + 13] = mvMatrix[1][3]; data[cursor + 14] = mvMatrix[2][0]; data[cursor + 15] = mvMatrix[2][1]; data[cursor + 16] = mvMatrix[2][2]; data[cursor + 17] = mvMatrix[2][3]; data[cursor + 18] = mvMatrix[3][0]; data[cursor + 19] = mvMatrix[3][1]; data[cursor + 20] = mvMatrix[3][2]; data[cursor + 21] = mvMatrix[3][3]; data[cursor + 22] = obj - > color.r; data[cursor + 23] = obj - > color.g; data[cursor + 24] = obj - > color.b; data[cursor + 25] = obj - > color.a; cursor += floatsPerVert; // Vertex 1 data[cursor + 0] = -1.0 f; data[cursor + 1] = -1.0 f; data[cursor + 2] = 0.0 f; data[cursor + 3] = 1.0 f; input.u = 0.0 f; input.v = 0.0 f; output = texAtlas.getUV(obj - > textureName, input); data[cursor + 4] = output.u; data[cursor + 5] = output.v; data[cursor + 6] = mvMatrix[0][0]; data[cursor + 7] = mvMatrix[0][1]; data[cursor + 8] = mvMatrix[0][2]; data[cursor + 9] = mvMatrix[0][3]; data[cursor + 10] = mvMatrix[1][0]; data[cursor + 11] = mvMatrix[1][1]; data[cursor + 12] = mvMatrix[1][2]; data[cursor + 13] = mvMatrix[1][3]; data[cursor + 14] = mvMatrix[2][0]; data[cursor + 15] = mvMatrix[2][1]; data[cursor + 16] = mvMatrix[2][2]; data[cursor + 17] = mvMatrix[2][3]; data[cursor + 18] = mvMatrix[3][0]; data[cursor + 19] = mvMatrix[3][1]; data[cursor + 20] = mvMatrix[3][2]; data[cursor + 21] = mvMatrix[3][3]; data[cursor + 22] = obj - > color.r; data[cursor + 23] = obj - > color.g; data[cursor + 24] = obj - > color.b; data[cursor + 25] = obj - > color.a; cursor += floatsPerVert; // Vertex 2 data[cursor + 0] = 1.0 f; data[cursor + 1] = -1.0 f; data[cursor + 2] = 0.0 f; data[cursor + 3] = 1.0 f; input.u = 1.0 f; input.v = 0.0 f; output = texAtlas.getUV(obj - > textureName, input); data[cursor + 4] = output.u; data[cursor + 5] = output.v; data[cursor + 6] = mvMatrix[0][0]; data[cursor + 7] = mvMatrix[0][1]; data[cursor + 8] = mvMatrix[0][2]; data[cursor + 9] = mvMatrix[0][3]; data[cursor + 10] = mvMatrix[1][0]; data[cursor + 11] = mvMatrix[1][1]; data[cursor + 12] = mvMatrix[1][2]; data[cursor + 13] = mvMatrix[1][3]; data[cursor + 14] = mvMatrix[2][0]; data[cursor + 15] = mvMatrix[2][1]; data[cursor + 16] = mvMatrix[2][2]; data[cursor + 17] = mvMatrix[2][3]; data[cursor + 18] = mvMatrix[3][0]; data[cursor + 19] = mvMatrix[3][1]; data[cursor + 20] = mvMatrix[3][2]; data[cursor + 21] = mvMatrix[3][3]; data[cursor + 22] = obj - > color.r; data[cursor + 23] = obj - > color.g; data[cursor + 24] = obj - > color.b; data[cursor + 25] = obj - > color.a; cursor += floatsPerVert; // Triangle 2 // Vertex 3 data[cursor + 0] = 1.0 f; data[cursor + 1] = -1.0 f; data[cursor + 2] = 0.0 f; data[cursor + 3] = 1.0 f; input.u = 1.0 f; input.v = 0.0 f; output = texAtlas.getUV(obj - > textureName, input); data[cursor + 4] = output.u; data[cursor + 5] = output.v; data[cursor + 6] = mvMatrix[0][0]; data[cursor + 7] = mvMatrix[0][1]; data[cursor + 8] = mvMatrix[0][2]; data[cursor + 9] = mvMatrix[0][3]; data[cursor + 10] = mvMatrix[1][0]; data[cursor + 11] = mvMatrix[1][1]; data[cursor + 12] = mvMatrix[1][2]; data[cursor + 13] = mvMatrix[1][3]; data[cursor + 14] = mvMatrix[2][0]; data[cursor + 15] = mvMatrix[2][1]; data[cursor + 16] = mvMatrix[2][2]; data[cursor + 17] = mvMatrix[2][3]; data[cursor + 18] = mvMatrix[3][0]; data[cursor + 19] = mvMatrix[3][1]; data[cursor + 20] = mvMatrix[3][2]; data[cursor + 21] = mvMatrix[3][3]; data[cursor + 22] = obj - > color.r; data[cursor + 23] = obj - > color.g; data[cursor + 24] = obj - > color.b; data[cursor + 25] = obj - > color.a; cursor += floatsPerVert; // Vertex 4 data[cursor + 0] = 1.0 f; data[cursor + 1] = 1.0 f; data[cursor + 2] = 0.0 f; data[cursor + 3] = 1.0 f; input.u = 1.0 f; input.v = 1.0 f; output = texAtlas.getUV(obj - > textureName, input); data[cursor + 4] = output.u; data[cursor + 5] = output.v; data[cursor + 6] = mvMatrix[0][0]; data[cursor + 7] = mvMatrix[0][1]; data[cursor + 8] = mvMatrix[0][2]; data[cursor + 9] = mvMatrix[0][3]; data[cursor + 10] = mvMatrix[1][0]; data[cursor + 11] = mvMatrix[1][1]; data[cursor + 12] = mvMatrix[1][2]; data[cursor + 13] = mvMatrix[1][3]; data[cursor + 14] = mvMatrix[2][0]; data[cursor + 15] = mvMatrix[2][1]; data[cursor + 16] = mvMatrix[2][2]; data[cursor + 17] = mvMatrix[2][3]; data[cursor + 18] = mvMatrix[3][0]; data[cursor + 19] = mvMatrix[3][1]; data[cursor + 20] = mvMatrix[3][2]; data[cursor + 21] = mvMatrix[3][3]; data[cursor + 22] = obj - > color.r; data[cursor + 23] = obj - > color.g; data[cursor + 24] = obj - > color.b; data[cursor + 25] = obj - > color.a; cursor += floatsPerVert; // Vertex 5 data[cursor + 0] = -1.0 f; data[cursor + 1] = 1.0 f; data[cursor + 2] = 0.0 f; data[cursor + 3] = 1.0 f; input.u = 0.0 f; input.v = 1.0 f; output = texAtlas.getUV(obj - > textureName, input); data[cursor + 4] = output.u; data[cursor + 5] = output.v; data[cursor + 6] = mvMatrix[0][0]; data[cursor + 7] = mvMatrix[0][1]; data[cursor + 8] = mvMatrix[0][2]; data[cursor + 9] = mvMatrix[0][3]; data[cursor + 10] = mvMatrix[1][0]; data[cursor + 11] = mvMatrix[1][1]; data[cursor + 12] = mvMatrix[1][2]; data[cursor + 13] = mvMatrix[1][3]; data[cursor + 14] = mvMatrix[2][0]; data[cursor + 15] = mvMatrix[2][1]; data[cursor + 16] = mvMatrix[2][2]; data[cursor + 17] = mvMatrix[2][3]; data[cursor + 18] = mvMatrix[3][0]; data[cursor + 19] = mvMatrix[3][1]; data[cursor + 20] = mvMatrix[3][2]; data[cursor + 21] = mvMatrix[3][3]; data[cursor + 22] = obj - > color.r; data[cursor + 23] = obj - > color.g; data[cursor + 24] = obj - > color.b; data[cursor + 25] = obj - > color.a; cursor += floatsPerVert; q++; } } #if defined PLATFORM_WINDOWS || defined PLATFORM_OSX // Generate VAO glGenVertexArrays(1, (GLuint * ) & vao); checkGLError("glGenVertexArrays"); glBindVertexArray(vao); checkGLError("glBindVertexArray");# endif // Generate VBO glGenBuffers(1, (GLuint * ) & vbo); checkGLError("glGenBuffers"); glBindBuffer(GL_ARRAY_BUFFER, vbo); checkGLError("glBindBuffer"); // Load data into VBO glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * floatsPerVert * q, data, GL_STATIC_DRAW); checkGLError("glBufferData"); // Delete data delete data; // Get aspect float width = PLAT_GetWindowWidth(); float height = PLAT_GetWindowHeight();# ifdef PLATFORM_OPENVR float aspect = 1.0;# else float aspect = width / height;# endif // DRAW glEnable(GL_CULL_FACE); checkGLError("glEnable"); glFrontFace(GL_CCW); checkGLError("glFrontFace"); glCullFace(GL_BACK); checkGLError("glCullFace"); glEnable(GL_BLEND); checkGLError("ShapeRenderer glEnable");# ifndef PLATFORM_ANDROID glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); checkGLError("ShapeRenderer glBlendFunc");# endif // Add program to OpenGL environment int curProgram = -1; curProgram = programMain; glUseProgram(curProgram); checkGLError("SpriteRenderer glUseProgram"); #if defined PLATFORM_WINDOWS || defined PLATFORM_OSX // Bind the VAO glBindVertexArray(vao); checkGLError("glBindVertexArray");# endif // Bind the VBO glBindBuffer(GL_ARRAY_BUFFER, vbo); checkGLError("glBindBuffer"); // Set the projection matrix glm::mat4 projMatrix; #if defined PLATFORM_OPENVR projMatrix = glm::make_mat4((const GLfloat * ) g_projectionMatrix.get());# else projMatrix = glm::perspective(VIEW_FOV, aspect, 0.001 f, 1000.0 f);# endif setMatrix(curProgram, "projectionMatrix", projMatrix); setUniform4f(curProgram, "globalColor", globalColor.x, globalColor.y, globalColor.z, globalColor.w); int t = texAtlas.getGlTexId(); glActiveTexture(GL_TEXTURE0); checkGLError("glActiveTexture"); glBindTexture(GL_TEXTURE_2D, t); setUniform2f(curProgram, "vTexSpan", 1.0, 1.0); setUniform1f(curProgram, "useTexture", 1.0); setUniform1f(curProgram, "fadeNear", 600.0 * NDC_SCALE); setUniform1f(curProgram, "fadeFar", 900.0 * NDC_SCALE); // Set attributes setVertexAttrib(curProgram, "vPosition", 4, GL_FLOAT, false, floatsPerVert * sizeof(float), 0); setVertexAttrib(curProgram, "vTexCoords", 2, GL_FLOAT, false, floatsPerVert * sizeof(float), 4); setVertexAttrib(curProgram, "mvMatrixPt1", 4, GL_FLOAT, false, floatsPerVert * sizeof(float), 6); setVertexAttrib(curProgram, "mvMatrixPt2", 4, GL_FLOAT, false, floatsPerVert * sizeof(float), 10); setVertexAttrib(curProgram, "mvMatrixPt3", 4, GL_FLOAT, false, floatsPerVert * sizeof(float), 14); setVertexAttrib(curProgram, "mvMatrixPt4", 4, GL_FLOAT, false, floatsPerVert * sizeof(float), 18); setVertexAttrib(curProgram, "vColor", 4, GL_FLOAT, false, floatsPerVert * sizeof(float), 22); // Draw glDrawArrays(GL_TRIANGLES, 0, q * 6); checkGLError("glDrawArrays"); #if defined PLATFORM_WINDOWS || defined PLATFORM_OSX // Reset glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); glUseProgram(0);# endif // Delete VAO and VBO glDeleteBuffers(1, (GLuint * ) & vbo);# if defined PLATFORM_WINDOWS || defined PLATFORM_OSX glDeleteVertexArrays(1, (GLuint * ) & vao);# endif Shader Code: // // VERTEX SHADER ES 2.0 // const char * vertexShaderCodeES20 = "attribute vec4 vPosition;"\ "varying lowp vec4 posOut; "\ "attribute vec2 vTexCoords;"\ "varying lowp vec2 vTexCoordsOut; "\ "uniform vec2 vTexSpan;"\ "attribute vec4 vNormal;"\ "varying vec4 vNormalOut;"\ "attribute vec4 vVertexLight; "\ "varying vec4 vVertexLightOut; "\ "uniform mat4 projectionMatrix; "\ "varying lowp float distToCamera; "\ "attribute vec4 mvMatrixPt1; "\ "attribute vec4 mvMatrixPt2; "\ "attribute vec4 mvMatrixPt3; "\ "attribute vec4 mvMatrixPt4; "\ "attribute vec4 vColor; "\ "varying vec4 vColorOut;"\ "attribute mat4 oldmvMatrix; "\ "void main() {"\ " mat4 mvMatrix; "\ " mvMatrix[0] = mvMatrixPt1; "\ " mvMatrix[1] = mvMatrixPt2; "\ " mvMatrix[2] = mvMatrixPt3; "\ " mvMatrix[3] = mvMatrixPt4; "\ " gl_Position = projectionMatrix * mvMatrix * vPosition; " " vTexCoordsOut = vTexCoords * vTexSpan; "\ " posOut = gl_Position; "\ " vec4 posBeforeProj = mvMatrix * vPosition;"\ " distToCamera = -posBeforeProj.z; "\ " vColorOut = vColor; "\ "}\n"; // // FRAGMENT SHADER ES 2.0 // const char * fragmentShaderCodeES20 = "uniform sampler2D uTexture; "\ "uniform lowp vec4 vColor; "\ "uniform lowp vec4 globalColor; "\ "varying lowp vec2 vTexCoordsOut; "\ "varying lowp vec4 posOut; "\ "uniform lowp float useTexture; "\ "uniform lowp float fadeNear; "\ "uniform lowp float fadeFar; "\ "varying lowp float distToCamera; "\ "varying lowp vec4 vColorOut; "\ "void main() {"\ " lowp vec4 f = texture2D(uTexture, vTexCoordsOut.st); "\ " if (f.a == 0.0) "\ " discard; "\ " lowp float visibility = 1.0; "\ " lowp float alpha = 1.0; "\ " if (distToCamera >= fadeFar) discard; "\ " if (distToCamera >= fadeNear) "\ " alpha = 1.0 - (distToCamera - fadeNear) * 3.0; "\ " if (useTexture == 1.0)"\ " {"\ " gl_FragColor = texture2D(uTexture, vTexCoordsOut.st) * vColorOut * vec4(visibility, visibility, visibility, alpha) * globalColor; "\ " }"\ " else"\ " {"\ " gl_FragColor = vColorOut * vec4(visibility, visibility, visibility, alpha) * globalColor; "\ " }"\ "}\n"; The rest of the new code is here: TextureAtlas.cpp Renderer.cpp https://github.com/dimitrilozovoy/Voxyc/
    29. that's awesome, I cant even begin imagining what writing graphic demos in assembly would look like, thats super impressive, did you learn directx/c++ via chillitomato? and I really like that idea of creating simple demos focusing on a single thing, thats really smart ty and ill try to not get down about it
    30. Valakor

      Compute shader return values

      I don't remember what the syntax is (or if it's possible) to return a statically-sized array like that in HLSL, but you can definitely use an out parameter. Something like: void CornerPoints(float x, float y, float z, out int[8*3] points) Note that you will likely need to do the x/y indexing manually for multidimensional arrays because I don't believe HLSL supports that (iirc).
    31. Its great you are trying to learn what is going on under the hood, yet consider focusing on one aspect - two at the most. Personally, before moving on to Unity, it was graphics and input. In both areas it began with DirectX and C++ and ended with writting demos for the Megadrive and ZX Spectrum using C and Assembly. That programming journey is its own reward, yet for the end result you find yourself with a game engine like Unity or Godot. I'm now doing VR with Unity with C# and while I'm glad things are far easier, its only because I spent those previous years sharpening my programming skills. Unable to comment on the systems you mentioned, but what helped in my journey was to start with the very basic building blocks, create simple demos focusing on a single task and to also constantly be revising the code to be the best it could be. Your current code should be the foundation of projects to follow, and naturally you'll move onto increasingly complex programs. Please do not get down about it - just start with the most basic thing you can do and do it well. Then take the next step.
    32. Yesterday
    33. I am a game design student at full sail, I have some experience in unity and C# I have not had the chance to jump into any game jams yet but I am interested. I'm willing to work on and learn almost anything and practice in my chosen future career path. Message me on discord @thesageofsteel#0338 if you are interested or you have any questions.
    34. kseh

      c# drawing sprites

      First, I don't think you want that one call to Invalidate(); inside your paint function. Second, you don't need to draw a black sprite over your collision sprite and you do not need to erase the collision sprite either. You just need to stop drawing your collision sprite. If a collision occurs, set a draw flag to true and start counting the number of times you enter the timer function. When that number gets to some value (maybe start with 100 then adjust for duration you want) then set the draw flag to false and reset the count. If the draw flag is set, then draw the collision sprite. This is the best and simplest advice I can suggest without providing actual code for an example. Third, I would also like to repeat @GoliathForge's suggestion about keeping notes. I keep a lot of notes in a separate file and I find it useful both in making a plan before I start coding and also when I want to remember why I approached a problem a certain way. I recommend that while you are working, write down what you are doing and why. And find a way to keep your notes organized that makes them the most effective for you. Good luck on your project.
    35. IanBroussard

      Team Building

      So I am new to a whole bunch of systems that obviously exist within the digital structure. It feels as if by the time I catch up it will all be something different, thus I am behind and always will be. So to speed up my time line I am reaching out there to find others interested in joining forces. I am currently working with my wife to develop a mobile app in Unity. Building our Game design document, meanwhile building my hierarchy of buttons and battle arenas, dealing with the major frustrations that come with having to look at every aspect of creating a company, app, and universe.. Right where is the topic, well any guidance that I can find in getting me towards others who are looking to join together would be nice. I have strong suits, so does my wife, we are needing people good in unity. If this is in the wrong area to post this, I apologize. We are needing someone who has worked with photon and making some rather simple prefabs for our card game. We do so much art and this digital integration is unfamiliar and deeply hard to navigate at times. I have been spending 10 months getting familiar with blender, unity, and other programs associated with some aspects. Doing tutorials (the timeline is insanely long to do it this way.) However try as I might to reach out to people, most places seem to be dead ends or loops. So, I started actually sharing this game, while I hear the voice of concern that the world just tramples it, I don't know how else to go about getting myself out there. If anyone has any pertinent caring advice, I would love to hear it. Thank you all for your time. Ian Broussard
    36. IanBroussard

      Can only create games with game engines.

      There are some really good tutorials available from various places. Not sure if I should put plugs in here for anything. I am new to this site. Message me if youd like any suggestions. I hope and wish you the best along your paths.
    37. Hi, I am trying to move some of my C# code for a noise implementation onto a Unity HLSL compute shader. Unfortunately some of the functions returns arrays. I have looked at several resources in an attempt to find out how to do this but I still don't have a working solution. I did find a similar question on here (see the bottom of this post). In this case using `out' was suggested. Is this the correct way to handle this? If so what would the correct syntax be for a function which also has three parameters, such as: int[] CornerPoints(float x, float y, float z) In this case the returned array will be a multidimensional array. int[8,3] .Any pointers in the right direction would be much appreciated.
    38. Hi, I am a 13 year old and I've been playing games for practically my entire life, and I am thinking about getting into game development as my career. However I am worried about for one the pay, and if I will be able to support myself. And two if I will even be able to get a job in the industry because obviously a lot of people would want to get a job in this field and it will be very competitive. I have already started fiddling with unity and i really like it, so its not a matter of resources or if I enjoy it. So i guess my question for someone who is already in the industry is was it worth it? And if so do you have any tips or advise on how to get a good job as a game developer. Thanks in advance..
    39. I started in HTML, JavScript land so that's probably not much help to you... I started with the Jon Duckett books and they were awesome! C# was one area I made a mistake with ordering the wrong book. 😛 Shoulda ordered the WPF and .Net but I accidentally ordered just a straight C# book, which is fine, but very little help... I'm currently learning WPF software development in C#, and honestly I'm exactly where you are with that as I don't know what exactly to learn... I know what I need to do, but I can't make myself spend another $60 on a book when I just ordered the wrong one! 😛 As far as game development I'm the artist of my project, not the programmer.
    40. I don't know. You go try, see how it works. I program 2d stuff because I find dealing with kinematic physics distracts from actually working on the game rules and algorithms that I think actually make a good game.
    41. phil67rpg

      c# drawing sprites

      well the above code is my latest code, it almost works, the bullet hits the bug but then draws the collision sprite, what I want it to do is draw the collision sprite for a little time then draw the black sprite over it or erase it altogether.
    42. Tom Sloper

      c# drawing sprites

      Phil, now you need to show your latest code and describe the problem you're having now.
    43. congard

      Array of samplerCube

      Problem solved. For correct work, I had to fill the entire samplerCube array with zeros. Otherwise, there will be a black screen. At the expense of glare: apparently, the problem was in the open drivers. The test was performed on Windows with the official drivers, and everything was displayed correctly, including the color correction. But the 1st point is not canceled.
    44. phil67rpg

      c# drawing sprites

      no it did not work before or after I adjusted it, I believe I started it. I agree I am so close.
    45. With a quad tree (or MBVH with 4 children) the node count increases by 1/3th. You could also use a multi level grid with similar extended bounds than loose quadtree to avoid splitting or sharing triangles. This way you would see where you get with less work. I assume you do not want to cull individual triangles. You likely want to make clusters by stopping further subdivision at some number. This is an opportunity to do something better: You could cluster nearby triangles with similar normals. This allows also efficient backface culling using the resulting cone bounding the normals. Those clusters could then form the input to your hierarchy generation, or maybe just brute force culling the clusters binned to a single coarse grid is good enough.
    46. yeh im trying to build an engine ontop of monogame to learn how stuff is done under the hood like Input,UI stuff like that to build my game ontop of, I just dont wanna be trapped inside an engine and be able to implement stuff myself,I tend to find videos to be a waste of time most of the time if its to implement something cause you basically just monkey see monkey do, and if u where to re write it the next day you couldn't even remember 5% of it , and no worries the more information the better which books have you read up on?
    47. Couldn't I work it out somehow in full 3d using VR?
    48. Oh, And I'll add one more thing since I didn't actually answer your question about how to learn to do all the things you want to. From what I can tell you want to learn how to build a game engine and then build your own game that way? I personally don't know everything you'll need to know about doing that, but When I did start learning from scratch, I started with a Youtube series and then switched to a book. A comprehensive book is really nice tool to have because it can offer answers on demand a lot of the time, so I would suggest you do some research on good books on C++ and Game engines. Check out reviews and all that stuff for at least a day, and also don't skimp on research because you might order a book, and then realize later it's not exactly what you needed (I wouldn't know anything about that 😇) Also, like I said above don't order books for the entire project. That's an easy way to waste money because you don't know exactly what you'll need when you start out. Just order them as you go for the demand you have. As far as videos go, they're actually really good, but unless you implement the code they teach you in the moment, they're usually much to temporary and you end up wasting a lot of time for the 20% of the information you'll be remembering and using, whereas like I said a book is much more "usable" as you actually have to use your brain to piece together the code, so you end up retaining it much better! Hopefully I was able to help! Sorry if this is an overload of information! 😂
    49. hey, just wondering, would you be open to me participating? I have little experience with game jams, but have been programming for 10 years or so now and am trying to get more familiar with unity and C#. if that sounds alright, my discord is Taylorobey #5742, feel free to shoot me a message.
    50. So I'm in the process of learning how to create (idle) animations for 2D characters, using Photoshop as my drawing app. I've made this base character at 2000x2000+ (which will later be downsized quite a lot), and I'm looking to create some simple breathing animations based on him. I'm then wondering if any of you have any techniques for creating slight differences in the art (for example breathing, slight movements of arms and legs) without spending too much time having to "redraw" everything? Should I be using transformation tools, warping tools, or anything else? Or should I actually redraw most of it?
    51. Tom Sloper

      aspiring environmental artist

      You need skills in architecture and UX design and lighting and game design. Sounds like you need to become a superstar (right now you sound like a beginner) at Unreal and Max. If you can try a little Unity, that would be good too. And you'll need a solid portfolio.
    52. This isn't a Writing question, so I'm moving it to an appropriate forum.
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!