Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 19.07.2011, 14:16   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Вопрос Вопросы по GLSL

Пока что 2 вопроса :

1) Когда передаёш текстуру шейдеру (в uniform переменную) передаётся ссылка на неё, или её копия?
2)Вот такой код рисует затекстуреный квадрат:
Пишу на java с исползованием lwjgl и загрущиком текстуры slick-util (хотя это не важно)
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.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(); 
Код вершиного шейдера:
void main(){
    
gl_FrontColor gl_Color;
    
gl_Position ftransform();

и пиксельного
void main(){
    
gl_FragColor gl_Color;

shader является экземпляром моего класса Shader, вот навсякий случай его код (он рабочий)
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, но я повсякому пробывал, не получается
(Offline)
 
Ответить с цитированием
Старый 19.07.2011, 22:59   #2
Venom2
 
Сообщений: n/a
Ответ: Вопросы по GLSL

Сообщение от Den Посмотреть сообщение
Когда передаёш текстуру шейдеру (в 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.
можно также свои аттрибуты задавать, но это уже отдельная песня
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
den (19.07.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com