添加Stars3D.java
/**
 *
 * @author yangshuohao
 */
public class Stars3D 
{
    private final float m_spread;
    private final float m_speed;
    
    private final float m_starX[];
    private final float m_starY[];
    private final float m_starZ[];
    
    public Stars3D(int numStars,float spread,float speed)
    {
        m_spread=spread;
        m_speed=speed;
        
        m_starX=new float[numStars];
        m_starY=new float[numStars];
        m_starZ=new float[numStars];

        for(int i=0;i<m_starX.length;i++)
        {
            InitStar(i);
        }
    }
    
    private void InitStar(int i)
    {
        m_starX[i]=2 * ((float)Math.random()-0.5f)*m_spread;
        m_starY[i]=2 * ((float)Math.random()-0.5f)*m_spread;
        m_starZ[i]=((float)Math.random()+0.00001f)*m_spread;              
    }

    public void UpdateAndRender(Bitmap target,float delta)
    {
        target.Clear((byte)0x00);
        
        float halfWidth=target.GetWidth()/2.0f;
        float halfHeight=target.GetHeight()/2.0f;

        for(int i=0;i<m_starX.length;i++)
        {
            m_starZ[i]-=delta*m_speed;
            
            if(m_starZ[i] <=0 )
            {
                InitStar(i);
            }
            
            int x=(int)((m_starX[i]/m_starZ[i])*halfWidth+halfWidth);
            int y=(int)((m_starY[i]/m_starZ[i])*halfHeight+halfHeight);

            if(x<0 || x>=target.GetWidth() || (y<0 || y>=target.GetHeight()))
            {
                InitStar(i);
            }
            else
            {
                target.DrawPixel(x, y, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff);
            }
        }
    }
}
修改Display.java
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.awt.image.BufferStrategy;
import java.awt.image.DataBufferByte;
import javax.swing.JFrame;
/**
 *
 * @author yangshuohao
 */
public class Display extends Canvas
{
    private final JFrame m_frame;
    private final Bitmap m_frameBuffer;
    private final BufferedImage m_displayImage;
    private final byte[] m_displayComponents;
    private final BufferStrategy m_bufferStrategy;
    private final Graphics m_grGraphics;
    
    public Bitmap GetFrameBuffer() { return m_frameBuffer; }
    
    public Display(int width,int height,String title)
    {
        Dimension size=new Dimension(width,height);
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        
        m_frameBuffer=new Bitmap(width,height);
        m_displayImage=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
        m_displayComponents=((DataBufferByte)m_displayImage.getRaster().getDataBuffer()).getData();
        
        m_frameBuffer.Clear((byte)0x80);
        for(int i=0;i<100;i++)
        {
            m_frameBuffer.DrawPixel(100+i, 100+i, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff);
        }
        
        m_frame=new JFrame();
        m_frame.add(this);
        m_frame.pack();
        m_frame.setResizable(false);
        m_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        m_frame.setLocationRelativeTo(null);
        m_frame.setTitle(title);
        m_frame.setVisible(true);
        
        createBufferStrategy(1);
        m_bufferStrategy=getBufferStrategy();
        m_grGraphics=m_bufferStrategy.getDrawGraphics();
    }
    
    public void SwapBuffers()
    {
        m_frameBuffer.CopyToByteArray(m_displayComponents);
        m_grGraphics.drawImage(m_displayImage, 0, 0, m_frameBuffer.GetWidth()
        ,m_frameBuffer.GetHeight(),null);
        m_bufferStrategy.show();
    }
}
修改Main.java
/**
 *
 * @author yangshuohao
 */
public class Main 
{
     public static void main(String[] args) 
    {
        
        Display display=new Display(800,660,"Render");
        Bitmap target=display.GetFrameBuffer();
        Stars3D stars=new Stars3D(4096,64.0f,20.0f);
        
        long previousTime=System.nanoTime();
        while (true)
        {            
            long currentTime=System.nanoTime();
            float delta=(float)((currentTime-previousTime)/1000000000.0);
            previousTime=currentTime;
            
            stars.UpdateAndRender(target, delta);
            display.SwapBuffers();
        }
    }
}
结果

3D软件渲染教程:星域_i++