添加RenderText.java
/**
 *
 * @author yangshuohao
 */
public class RenderContext extends Bitmap
{
    private final int m_scanBuffer[];
    
    public RenderContext(int width,int height)
    {
        super(width,height);
        m_scanBuffer=new int[height*2];
    }
    
    public void DrawScanBuffer(int yCoord,int xMin,int xMax)
    {
        m_scanBuffer[yCoord*2]=xMin;
        m_scanBuffer[yCoord*2+1]=xMax;
    }
    
    public void FillShape(int yMin,int yMax)
    {
        for(int j=yMin;j<yMax;j++)
        {
            int xMin=m_scanBuffer[j*2];
            int xMax=m_scanBuffer[j*2+1];
            
            for(int i=xMin;i<xMax;i++)
            {
                DrawPixel(i, j, (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 RenderContext m_frameBuffer;
    private final BufferedImage m_displayImage;
    private final byte[] m_displayComponents;
    private final BufferStrategy m_bufferStrategy;
    private final Graphics m_grGraphics;
    
    public RenderContext 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 RenderContext(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");
        RenderContext 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);
            target.Clear((byte)0x00);
            
            for(int j=100;j<200;j++)
            {
                target.DrawScanBuffer(j, 100, 200);
            }
            
            target.FillShape(100, 200);
            
            display.SwapBuffers();
        }
    }
}

结果

3D软件渲染教程:渲染实体_i++

 个人网站