как рисовать в opengl?
afq Дата: Среда, 22 Ноября 2017, 06:37 | Сообщение # 1
Разработчик
Сейчас нет на сайте
В книге прочитал что в версии opengl 3.1 был убран режим отображения с использованием glBegin(), glEnd(). Но потом добавили для режима совместимости. Какие тогда способы остаются? glDraw*? Еще есть какие нибудь. Тоесть, теперь рисовать лучше glDraw?Добавлено (22 ноября 2017, 06:37) --------------------------------------------- Есть кто нибудь с opengl работающие, вы знали об этом? Как рисуете, шейдерами?
Сообщение отредактировал afq - Среда, 22 Ноября 2017, 06:36
Ordan Дата: Среда, 22 Ноября 2017, 06:42 | Сообщение # 2
Главный зомби
Сейчас нет на сайте
Рисую в опенГЛ лишь 2д текстурами mapTexture.Bind; glPushMatrix; x3:=GX*50-GY*50+0; y3:=GX*29+GY*29+0; glTranslatef(x3,y3,0); glColor3f(1.0,1.0,1.0); Kvadrat(500, 288, 100, 58, 1,1,false); glPopMatrix; procedure Kvadrat(XSize, YSize, sprX, sprY, strok, stolb:integer; flip:boolean); begin if (flip=true) then // вариант с зеркальным отражением begin glBegin(GL_QUADS); glTexCoord2f( (SprX+(stolb-1)*sprX)/XSize, 1-(sprY+(strok-1)*sprY)/YSize); glVertex2f(0,0); glTexCoord2f( (0+(stolb-1)*sprX)/XSize, 1-(sprY+(strok-1)*sprY)/YSize); glVertex2f(sprX,0); glTexCoord2f( (0+(stolb-1)*sprX)/XSize, 1-(0+(strok-1)*sprY)/YSize);glVertex2f(sprX,sprY); glTexCoord2f( (SprX+(stolb-1)*sprX)/XSize, 1-(0+(strok-1)*sprY)/YSize);glVertex2f(0,sprY); glEnd; end else // вариант без зеркального отражения begin glBegin(GL_QUADS); glTexCoord2f( (0 +(stolb-1)*sprX)/XSize, 1-(sprY+(strok-1)*sprY)/YSize); glVertex2f(0,0); glTexCoord2f( (SprX+(stolb-1)*sprX)/XSize, 1-(sprY+(strok-1)*sprY)/YSize); glVertex2f(sprX,0); glTexCoord2f( (SprX+(stolb-1)*sprX)/XSize, 1-(0+(strok-1)*sprY)/YSize);glVertex2f(sprX,sprY); glTexCoord2f( (0 +(stolb-1)*sprX)/XSize, 1-(0+(strok-1)*sprY)/YSize);glVertex2f(0,sprY); glEnd; end; end;
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2) Мои проекты ТЫК Мои видяхи на ютубэ ТЫК Если ты споришь с идиотом, вероятно тоже самое делает и он.
Snake174 Дата: Среда, 22 Ноября 2017, 06:59 | Сообщение # 3
участник
Сейчас нет на сайте
На Java
Код
package pointer.media; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.ARBVertexBufferObject; import org.lwjgl.util.vector.Vector2f; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import static org.lwjgl.BufferUtils.createByteBuffer; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; import static org.lwjgl.opengl.GL15.glGenBuffers; public class Sprite { public static final int NORMAL = 0, FLIP_VERTICAL = 1, FLIP_HORIZONTAL = 2; private int texID = 0; private FloatBuffer quadVertices = null; private FloatBuffer quadTexVertices = null; private int vboQuadHandle = 0; private int vboQuadTexHandle = 0; private Vector2f size; private Vector2f position = new Vector2f( 0, 0 ); private float angle = 0; public Sprite( InputStream is ) { try { BufferedImage bufImg = ImageIO.read( is ); size = new Vector2f( bufImg.getWidth(), bufImg.getHeight() ); int[] pixels = new int[ bufImg.getWidth() * bufImg.getHeight() ]; bufImg.getRGB( 0, 0, bufImg.getWidth(), bufImg.getHeight(), pixels, 0, bufImg.getWidth() ); ByteBuffer buffer = createByteBuffer( bufImg.getWidth() * bufImg.getHeight() * 4 ); for (int y = 0; y < bufImg.getHeight(); ++y) { for (int x = 0; x < bufImg.getWidth(); ++x) { int pixel = pixels[ y * bufImg.getWidth() + x ]; buffer.put( (byte)((pixel >> 16) & 0xFF) ); buffer.put( (byte)((pixel >> 8) & 0xFF) ); buffer.put( (byte)(pixel & 0xFF) ); buffer.put( (byte)((pixel >> 24) & 0xFF) ); } } buffer.flip(); texID = glGenTextures(); glBindTexture( GL_TEXTURE_2D, texID ); glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, bufImg.getWidth(), bufImg.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer ); float[] vert = { -bufImg.getWidth() / 2.0f, -bufImg.getHeight() / 2.0f, bufImg.getWidth() / 2.0f, -bufImg.getHeight() / 2.0f, bufImg.getWidth() / 2.0f, bufImg.getHeight() / 2.0f, -bufImg.getWidth() / 2.0f, bufImg.getHeight() / 2.0f }; float[] texVertices = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; vboQuadHandle = glGenBuffers(); vboQuadTexHandle = glGenBuffers(); quadVertices = BufferUtils.createFloatBuffer( 4 * 2 ); quadVertices.put( vert ); quadVertices.flip(); quadTexVertices = BufferUtils.createFloatBuffer( 4 * 2 ); quadTexVertices.put( texVertices ); quadTexVertices.flip(); ARBVertexBufferObject.glBindBufferARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vboQuadHandle ); ARBVertexBufferObject.glBufferDataARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, quadVertices, ARBVertexBufferObject.GL_STREAM_DRAW_ARB ); ARBVertexBufferObject.glBindBufferARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vboQuadTexHandle ); ARBVertexBufferObject.glBufferDataARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, quadTexVertices, ARBVertexBufferObject.GL_STREAM_DRAW_ARB ); ARBVertexBufferObject.glBindBufferARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, 0 ); } catch (Exception e) { System.err.println( "Sprite: " + e.getLocalizedMessage() ); } } public int getID() { return texID; } public void setPosition( Vector2f pos ) { position = pos; } /** * Set pivot to sprite in pixels * @param p: new pivot */ public void setPivot( Vector2f p ) { float tlX = p.getX() == 0 ? 0 : p.getX() - size.getX(); float tlY = p.getY() == 0 ? 0 : p.getY() - size.getY(); float trX = p.getX() == 0 ? size.getX() : size.getX() - p.getX(); float trY = p.getY() == 0 ? 0 : p.getY() - size.getY(); float brX = p.getX() == 0 ? size.getX() : size.getX() - p.getX(); float brY = p.getY() == 0 ? size.getY() : size.getY() - p.getY(); float blX = p.getX() == 0 ? 0 : p.getX() - size.getX(); float blY = p.getY() == 0 ? size.getY() : size.getY() - p.getY(); float[] vert = { tlX, tlY, trX, trY, brX, brY, blX, blY }; quadVertices.clear(); quadVertices.put( vert ); quadVertices.flip(); } public void setAngle( float a ) { angle = a; } public void setDrawMode( int dm ) { // Normal render float[] texVertices = new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; // Flip vertical if (dm == FLIP_VERTICAL) { texVertices = new float[] { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f }; } // Flip horizontal else if (dm == FLIP_HORIZONTAL) { texVertices = new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; } quadTexVertices.clear(); quadTexVertices.put( texVertices ); quadTexVertices.flip(); } public void draw() { ARBVertexBufferObject.glBindBufferARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vboQuadHandle ); ARBVertexBufferObject.glBufferSubDataARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, 0L, quadVertices ); glVertexPointer( 2, GL_FLOAT, 0, 0L ); ARBVertexBufferObject.glBindBufferARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vboQuadTexHandle ); ARBVertexBufferObject.glBufferSubDataARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, 0L, quadTexVertices ); glTexCoordPointer( 2, GL_FLOAT, 0, 0L ); ARBVertexBufferObject.glBindBufferARB( ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, 0 ); glLoadIdentity(); glTranslatef( position.getX(), position.getY(), 0.0f ); glRotatef( angle, 0.0f, 0.0f, 1.0f ); glEnable( GL_TEXTURE_2D ); glBindTexture( GL_TEXTURE_2D, texID ); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_TEXTURE_COORD_ARRAY ); glDrawArrays( GL_QUADS, 0, 4 ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glDisableClientState( GL_VERTEX_ARRAY ); glBindTexture( GL_TEXTURE_2D, 0 ); glDisable( GL_TEXTURE_2D ); } public void destroy() { glDeleteTextures( texID ); ARBVertexBufferObject.glDeleteBuffersARB( vboQuadHandle ); ARBVertexBufferObject.glDeleteBuffersARB( vboQuadTexHandle ); } }
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
Сообщение отредактировал Snake174 - Среда, 22 Ноября 2017, 07:00
afq Дата: Среда, 22 Ноября 2017, 09:43 | Сообщение # 4
Разработчик
Сейчас нет на сайте
Ordan , в 4 opengl даже gluLookAt нет, и работы с матрицами, и glTranslate, glRotate, все это в другой либе есть, или похожее на это. Это я в книге вычитал "OpenGL 4. Язык шейдеров".
Ordan Дата: Среда, 22 Ноября 2017, 09:53 | Сообщение # 5
Главный зомби
Сейчас нет на сайте
Цитата afq (
)
Это я в книге вычитал "OpenGL 4. Язык шейдеров".
Я не спец в опенГЛе но звучит как ересь, если их нет в привычном виде значит они есть в другом виде. У меня версия 4.2 и все есть.
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2) Мои проекты ТЫК Мои видяхи на ютубэ ТЫК Если ты споришь с идиотом, вероятно тоже самое делает и он.
afq Дата: Среда, 22 Ноября 2017, 12:24 | Сообщение # 6
Разработчик
Сейчас нет на сайте
Ordan , у меня тоже есть, но пишут что это для совместимости, а так, она еще в 3.0 версии устарело, и в 3.1 исключили. Потом как core ( какой то ) сделали, чтобы старые функции работали. В общем лучшего исчерпывающего ответа не найти, кроме как прочитать в этой книге. Так что если вдруг захочется прочитать такую книгу, то там написано более развернуто.
Xakep Дата: Среда, 22 Ноября 2017, 12:49 | Сообщение # 7
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата Ordan (
)
Я не спец в опенГЛе но звучит как ересь, если их нет в привычном виде значит они есть в другом виде. У меня версия 4.2 и все есть.
все правильно, нету больше этого, для работы с матрицами есть отдельные библиотеки, на C++ в основном - это glm , сейчас в OpenGL все делается через шейдеры, поэтому все эти вызовы устарели как и glPushMatrix, glPopMatrix итд.afq glBegin и glEnd давно устарели, они работают намного медленнее чем glDraw*, именно их и используй для рисования, гугли VBO/VAO. Отличный ресурс для изучения нового OpenGL (ну как нового, давно уже не так): http://www.opengl-tutorial.org/
Сообщение отредактировал Xakep - Среда, 22 Ноября 2017, 12:49