Язык PureBasic, но в принципе можно на любом, который поддерживает разработку на OGL
Код:
Procedure Cube()
glBegin_(#GL_QUADS)
glTexCoord2i_(0, 0) : glVertex3f_(-1, -1, -1)
glTexCoord2i_(0, 1) : glVertex3f_(-1, -1, 1)
glTexCoord2i_(1, 1) : glVertex3f_(-1, 1, 1)
glTexCoord2i_(1, 0) : glVertex3f_(-1, 1, -1)
glTexCoord2i_(0, 0) : glVertex3f_( 1, -1, -1)
glTexCoord2i_(0, 1) : glVertex3f_( 1, -1, 1)
glTexCoord2i_(1, 1) : glVertex3f_( 1, 1, 1)
glTexCoord2i_(1, 0) : glVertex3f_( 1, 1, -1)
glTexCoord2i_(0, 0) : glVertex3f_(-1, -1, -1)
glTexCoord2i_(0, 1) : glVertex3f_(-1, -1, 1)
glTexCoord2i_(1, 1) : glVertex3f_( 1, -1, 1)
glTexCoord2i_(1, 0) : glVertex3f_( 1, -1, -1)
glTexCoord2i_(0, 0) : glVertex3f_(-1, 1, -1)
glTexCoord2i_(0, 1) : glVertex3f_(-1, 1, 1)
glTexCoord2i_(1, 1) : glVertex3f_( 1, 1, 1)
glTexCoord2i_(1, 0) : glVertex3f_( 1, 1, -1)
glTexCoord2i_(0, 0) : glVertex3f_(-1, -1, -1)
glTexCoord2i_(0, 1) : glVertex3f_(-1, 1, -1)
glTexCoord2i_(1, 1) : glVertex3f_( 1, 1, -1)
glTexCoord2i_(1, 0) : glVertex3f_( 1, -1, -1)
glTexCoord2i_(0, 0) : glVertex3f_(-1, -1, 1)
glTexCoord2i_(0, 1) : glVertex3f_(-1, 1, 1)
glTexCoord2i_(1, 1) : glVertex3f_( 1, 1, 1)
glTexCoord2i_(1, 0) : glVertex3f_( 1, -1, 1)
glEnd_()
EndProcedure
UseJPEGImageDecoder()
UsePNGImageDecoder()
Define *Buffer
Define TextureID.I
Define window_width.l = 500
Define window_height.l = 500
#size = 256
;#ImagePath = #PB_Compiler_Home + "Examples/3D/Data/Textures/"
;LoadImage(0, #ImagePath+"Geebee2.bmp")
;LoadImage(0, #ImagePath+"Wood.jpg")
;*Buffer = EncodeImage(0)
*Buffer = AllocateMemory(3*256*256) ; static unsigned char texture[3 * SIZE * SIZE];
OpenWindow(0, 1, 1, window_width, window_height, "OGL - рекурсивный рендеринг текстур")
SetWindowColor(0, 0)
OpenGLGadget(0, 0, 0, window_height , window_height)
glEnable_(#GL_TEXTURE_2D)
glEnable_(#GL_DEPTH_TEST)
; ----- Generate texture
glGenTextures_(1, @TextureID)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_CLAMP);
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_CLAMP);
glTexImage2D_(#GL_TEXTURE_2D, 0, 3, #size, #size, 0, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *Buffer);*Buffer+57)
FreeMemory(*Buffer)
Repeat
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
glLoadIdentity_()
glTranslatef_(0.0, 0.0, -10)
glRotatef_(30, 1, 0, 0)
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
glLoadIdentity_()
glTranslatef_(0, 0, -11)
;
ro.f+1
glRotatef_(ro, 1, 1, 1)
;'/* Define a view-port adapted to the texture */
glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(20, 1, 5, 15)
glViewport_(0, 0, #size, #size)
glMatrixMode_(#GL_MODELVIEW)
;'/* Render to buffer */
glClearColor_(255, 175, 1, 0)
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
cube()
glFlush_()
glCopyTexSubImage2D_(#GL_TEXTURE_2D, 0, 5, 5, 0, 0, #size - 10, #size - 10)
;'/* Render to screen */
glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(20, window_width / window_height, 5, 15)
glViewport_(0, 0, window_width, window_height)
glMatrixMode_(#GL_MODELVIEW)
glClearColor_(0, 0, 0, 0)
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
cube()
;SetGadgetAttribute(0,#PB_OpenGL_FlipBuffers, #True)
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
If WaitWindowEvent(10) = #PB_Event_CloseWindow
glDeleteTextures_(1, @TextureID)
Break
EndIf
ForEver