(Unity3D)用软刷(逻辑)绘画

时间:2014-01-29 06:40:11

标签: unity3d paint brush

在过去的几天里,我正在编写一个正在进行的游戏的绘画行为,而且我目前处于一个非常高级的阶段,我可以说我完成了90%的工作并完美地工作,现在我需要什么要做的是能够用“软刷”绘制,因为现在它就像是用“像素风格”绘画,这完全是我所写的, 我目前的目标是使用这个解决方案:

  1. 导入画笔纹理this image
  2. 创建一个包含该纹理的所有Alpha值的数组
  3. 绘图时使用数组元素以定义新像素alpha
  4. 这是我的代码(它不是很长,评论太多)

    //The main painting method
            //theObject     = the object to be painted
            //tmpTexture    = the object current texture
            //targetTexture = the new texture 
            void paint (GameObject theObject, Texture2D tmpTexture, Texture2D targetTexture)
            {
                    //x and y are 2 floats from another class
                    //they store the coordinates of the pixel 
                    //that get hit by the RayCast
                    int x = (int)(coordinates.pixelPos.x);
                    int y = (int)(coordinates.pixelPos.y);
    
                    //iterate through a block of pixels that goes fro
                    //Y and X and go #brushHeight Pixels up
                    // and #brushWeight Pixels right
                    for (int tmpY = y; tmpY<y+brushHeight; tmpY++) {
                            for (int tmpX = x; tmpX<x+brushWidth; tmpX++) {
                                    //check if the current pixel is different from the target pixel
                                    if (tmpTexture.GetPixel (tmpX, tmpY) != targetTexture.GetPixel (tmpX, tmpY)) {
                                            //create a temporary color from the target pixel at the given coordinates
                                            Color tmpCol = targetTexture.GetPixel (tmpX, tmpY);
                                            //change the alpha of that pixel based on the brush alpha
                                            //myBrushAlpha is a 2 Dimensional array that contain
                                            //the different Alpha values of the brush
                                            //the substractions are to keep the index in range
                                            if (myBrushAlpha [tmpY - y, tmpX - x].a > 0) {
                                                tmpCol.a = myBrushAlpha [tmpY - y, tmpX - x].a;
                                            }
                                            //set the new pixel to the current texture
                                            tmpTexture.SetPixel (tmpX, tmpY, tmpCol);
                                    } 
                            }
                    }
                    //Apply 
                    tmpTexture.Apply ();
                    //change the object main texture 
                    theObject.renderer.material.mainTexture = tmpTexture;
            }
    

    现在有趣(和不好)的部分代码完全按照我的要求行事,但有一些我没有想到的东西,我花了一整夜的努力后无法解决, 问题是,通过要求随时使用画笔alpha绘制我发现自己创建了一个非常奇怪的效果,即降低“旧”像素的alpha值,所以我试图通过添加if语句来检查当前是否检查当前像素的alpha小于等效的刷子alpha像素,如果是,则将alpha增加到等于画笔,如果像素alpha更大,则继续向其添加画笔alpha值以使其具有“软刷”效果,在代码中就变成了这个:

                                                    if (myBrushAlpha [tmpY - y, tmpX - x].a > tmpCol.a) {
                                                            tmpCol.a = myBrushAlpha [tmpY - y, tmpX - x].a;
                                                    } else {
                                                            tmpCol.a += myBrushAlpha [tmpY - y, tmpX - x].a;
                                                    }
    

    但是在我完成之后,我得到了“像素化画笔”效果,我不确定,但我想也许是因为我在for循环中制作这些条件所以一切都在当前帧结束之前执行所以我没有看到效果,可能是那样吗? 我真的迷失了,希望你能把我放在正确的方向,

    非常感谢你,祝你有个美好的一天

0 个答案:

没有答案