forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Вопросы по GLSL (http://forum.boolean.name/showthread.php?t=15150)

den 19.07.2011 14:16

Вопросы по GLSL
 
Пока что 2 вопроса :) :

1) Когда передаёш текстуру шейдеру (в uniform переменную) передаётся ссылка на неё, или её копия?
2)Вот такой код рисует затекстуреный квадрат:
Пишу на java с исползованием lwjgl и загрущиком текстуры slick-util (хотя это не важно)
PHP код:

texture.bind(); // == glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
glBegin(GL11.GL_QUADS);
    
glTexCoord2f(0,0);
    
glVertex3f(-1,1,-10);
    
glTexCoord2f(1,0);
    
glVertex3f(1,1,-10);
    
glTexCoord2f(1,1);
    
glVertex3f(1,-1,-10);
    
glTexCoord2f(0,1);
    
glVertex3f(-1,-1,-10);
glEnd(); 

а вот если заюзать шейдер, то текстура не рисуется:
PHP код:

shader.begin();
texture.bind(); // == glBindTexture(GL_TEXTURE_2D, texture.getTextureID());
glBegin(GL11.GL_QUADS);
    
glTexCoord2f(0,0);
    
glVertex3f(-1,1,-10);
    
glTexCoord2f(1,0);
    
glVertex3f(1,1,-10);
    
glTexCoord2f(1,1);
    
glVertex3f(1,-1,-10);
    
glTexCoord2f(0,1);
    
glVertex3f(-1,-1,-10);
glEnd();
shader.end(); 

Код вершиного шейдера:
PHP код:

void main(){
    
gl_FrontColor gl_Color;
    
gl_Position ftransform();


и пиксельного
PHP код:

void main(){
    
gl_FragColor gl_Color;


shader является экземпляром моего класса Shader, вот навсякий случай его код (он рабочий)
PHP код:

package mygame;
import java.io.BufferedReader;
import java.io.FileReader;

import org.lwjgl.opengl.ARBFragmentShader;
import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.ARBVertexShader;


public class 
Shader {
    private 
String vertShaderFileNamefragShaderFileName;
    private 
int shader 0vertShader 0fragShader 0;
    private 
boolean useShader=true;
    
    public 
Shader(String vertShaderFileNameString fragShaderFileName) {
        
this.vertShaderFileName vertShaderFileName;
        
this.fragShaderFileName fragShaderFileName;
        
init();
    }
    
    public 
void setVariable(String nameVariablefloat variable) {
        if(
useShader)
            
ARBShaderObjects.glUniform1fARB(findVariable(nameVariable), variable);
    }
    
    public 
void setVariable(String nameVariableint variable) {
        if(
useShader)
            
ARBShaderObjects.glUniform1iARB(findVariable(nameVariable), variable);
    }
    
    public 
void setVariable(String nameVariablefloat variable1float variable2) {
        if(
useShader)
            
ARBShaderObjects.glUniform2fARB(findVariable(nameVariable), variable1variable2);
    }
    
    public 
void begin() {
        if(
useShader)
            
ARBShaderObjects.glUseProgramObjectARB(shader);
    }
    
    public 
void end() {
        
ARBShaderObjects.glUseProgramObjectARB(0);
    }
    
    private 
int findVariable(String nameVariable) {
        return 
ARBShaderObjects.glGetUniformLocationARB(shadernameVariable);
    }
    
    private 
void init() {
        
shader=ARBShaderObjects.glCreateProgramObjectARB();
        
        if(
shader!=0){
            
vertShader=createVertShader(vertShaderFileName);
            
fragShader=createFragShader(fragShaderFileName);
        }
        else 
useShader=false;

        if(
vertShader !=&& fragShader !=0){
            
ARBShaderObjects.glAttachObjectARB(shadervertShader);
            
ARBShaderObjects.glAttachObjectARB(shaderfragShader);
            
ARBShaderObjects.glLinkProgramARB(shader);
            
ARBShaderObjects.glValidateProgramARB(shader);
        }else 
useShader=false;
    }
    
    private 
int createVertShader(String filename){
        
vertShader=ARBShaderObjects.glCreateShaderObjectARB(ARBVertexShader.GL_VERTEX_SHADER_ARB);

        if(
vertShader==0){return 0;}
        
String vertexCode="";
        
String line;
        try{
            
BufferedReader reader=new BufferedReader(new FileReader(filename));
            while((
line=reader.readLine())!=null){
                
vertexCode+=line "\n";
            }
        }catch(
Exception e){
            
System.out.println("Fail reading vertex shading code");
            return 
0;
        }

        
ARBShaderObjects.glShaderSourceARB(vertShadervertexCode);
        
ARBShaderObjects.glCompileShaderARB(vertShader);

        return 
vertShader;
    }

    private 
int createFragShader(String filename){
        
fragShader=ARBShaderObjects.glCreateShaderObjectARB(ARBFragmentShader.GL_FRAGMENT_SHADER_ARB);
        if(
fragShader==0){return 0;}
            
String fragCode="";
            
String line;
        try{
            
BufferedReader reader=new BufferedReader(new FileReader(filename));
            while((
line=reader.readLine())!=null){
                
fragCode+=line "\n";
            }
        }catch(
Exception e){
            
System.out.println("Fail reading fragment shading code");
            return 
0;
        }
        
ARBShaderObjects.glShaderSourceARB(fragShaderfragCode);
        
ARBShaderObjects.glCompileShaderARB(fragShader);

        return 
fragShader;
    }



Поидее надо в шейдере что то добавить, типо texture2D, но я повсякому пробывал, не получается:(

Venom2 19.07.2011 22:59

Ответ: Вопросы по GLSL
 
Цитата:

Сообщение от Den (Сообщение 196160)
Когда передаёш текстуру шейдеру (в uniform переменную) передаётся ссылка на неё, или её копия?

Передается номер текстурного юнита.

делаешь активным юнит GL_TEXTURE#:
glActiveTexture(GL_TEXTURE0)

потом биндишь текстуру:
glBindTexture(тип текстуры, хендл)

в шейдер передаешь номер:
glUniform1i(номер юниформа, номер юнита)

номер юниформа получаешь c помощью
GetUniformLocation(хендл программы, имя юниформа)
после загрузки программы.

в пиксельном надо обьявить семплер соотвествующий типу текстуры (2D, 3D и т.п):
uniform sampler2D имя;

делаешь выборку из текстуры по текстурным координатам (тоже соответственно типу текстуры):
texture2D(имя, координаты)

и либо сразу передаешь в gl_FragColor, либо блендишь с цветом вершин, либо еще что-то.

ЗЫ
текстурные координаты представляются встроеным аттрибутом gl_MultiTexCoord# по номеру текстурного юнита, 4D вектор, для выборки texture2D нужно 2D вектор, так что юзай либо приведение типа vec2(gl_MultiTexCoord#), либо свиззл gl_MultiTexCoord#.xy.
можно также свои аттрибуты задавать, но это уже отдельная песня :)


Часовой пояс GMT +4, время: 21:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot